%2

Yuki Yamazaki's

2010, Knowledge Design has become 12 years old!

Book: JavaEE開発の準備

Persistence APIや、JSF、およびAjaxのコンポーネント、NetBeans、その他のミドルウェア(Single Sign On / Message Queue / JavaDB等)の充実はJavaのシステム開発を高レベルなものにしてくれるかも知れません。しかし、それぞれが目まぐるしくバージョンアップされ、なかなか落ち着いてアプリケーションレベルの検証ができていないので、ひとまずベースとなる検証環境をつくろうと考えました。

概観は、上記の通りですが、実際にどのような素材を使うかは動的に変わります。現状では以下のもので構成したいと考えています。

配備サーバー

Hardware
SunFire X2100 ( AMD Opteron 148, RAM 2G ) ( http://jp.sun.com/products/servers/entry/x2100/ )
OS
Solaris 10 ( 11/6 ) x86 (http://www.sun.com/software/solaris/get.jsp)
JDK
Java SE 6.0 u1 (http://java.sun.com/javase/downloads/index.jsp)
UPDATE(20070713): Java SE 6.0 u2
UPDATE(20071215): Java SE 6.0 u4
Application Server
UPDATE(2007/12/21) Sun Java System Application Server 9.1 Update 1 (http://java.sun.com/javaee/downloads/index.jsp)
UPDATE(2007/9/23) Sun Java System Application Server 9.1(http://java.sun.com/javaee/downloads/index.jsp)
UPDATE(2007/8/7) Sun Java System Application Server 9.1 beta2 (http://java.sun.com/javaee/downloads/index.jsp)
UPDATE(20070713): GlassFish build 55
RDBMS
JavaDB(JDK6) or MySQL5.x (http://www.mysql.com)

UPDATE: 2007/12/21
GlassFish V2UR1が最新のリリースとなっています。これにあわせ、Sun Java System Application Server 9.1 Update 1がSunより提供されています。

UPDATE: 2007/9/23
GlassFish build 58g(RC8)を持って、Betaがとれ、GlassFish v2のファイナルリリースとなりました。
GlassFish v1との違いで、私にとって興味のある変更点は、JDK6の正式対応とクラスタリングのサポートです。
ある程度、長い期間、これが安定バージョンとして使われることと思われます。
本バージョンは、Sun Java System Application Server 9.1 として、Sun(US)が有償のサポートを提供しはじめています。

また、Solaris U4 ( 8/07 ) が、リリースされています。

UPDATE: 2007/8/7
GlassFish build 58がSun Java System Application Server 9.1 RC1としてリリースされました。新しい方がバグが少なかろうと推測し、Build 56, 57を使用したのですがEJBやTopLink関連でいろいろ不具合がでました。結局、build 50gがもっとも安定してたように思います。新しいb58-RC1は私の作成しているアプリケーションを正しく処理してくれました。b58にアップデートします。

UPDATE: 2007/7/14
当初、Application Server 9.1 Beta2(build b41d-beta2)で進めていましたが、EJB3アノテーションがうまく動作しなかったため、これをGlassFish build 55に変更しました。b50gでもOKでした。また、JDK6u2でJavaDBのパッケージングが変わっています。GlassFishのこのアップデートは、おそらく、Application Server9.1の次のリリースにマージされることと思います。

(2007/6/13) Application Server 9.1がBetaであり、途中でアップデートの必要があるかもしれない。9.1を使用したのは、JDK6.0が正式にサポートされているためです。また、RDBMSに関しては、もし、データ量がそれほど大きくなければ、JDK付属のJavaDBでどこまでできるかを検討したいと考えています。

上記をインストールすると、使用できるJavaEEの各スペックが決まってくるので、開発環境は、上記に適合するようにします。

Sun Java System Application Server 9.1 がサポートする主なスペック

  • Enterprise Java Beans 3.0
  • JAXB 2.0
  • Java Persistence
  • Java Server Faces 1.2
  • Java Server Pages 2.1 (JSP 2.1)
  • Java Server Pages Standard Tag Library (JSTL) 1.2
  • Streaming API for XML(StAX)
  • Web Services Metadata
  • Java API for XMLbasedWeb Services 2.0 (JAX-WS 2.0)
  • CommonAnnotations for the Java Platform 1.0 (CAJ 1.0)
  • Java Servlet 2.5

これらの環境を作るための準備作業を記録していきます。
--

#1: JDKのアップデート

Solaris 10 ( 11/6 )では、JDK1.5がプレインストールされています。

# java -version
java version "1.5.0_11"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_11-b03)
Java HotSpot(TM) Client VM (build 1.5.0_11-b03, mixed mode, sharing)

これを 6.0u1にアップデートします。

SunよりSolaris10 x86用とx64用のSolarisパッケージ形式のJDKをダウンロードします。

# ls
jdk-6u1-solaris-amd64.tar.Z  jdk-6u1-solaris-i586.tar.Z

/usr/sfw/bin/gtar が便利なので、PATHを変更します。

# vi ~/.bashrc
PATH=/usr/sfw/bin:/usr/sbin:/usr/bin

# bash
# which gtar
/usr/sfw/bin/gtar

# mkdir work
# cd work

# gtar zxvf ../jdk-6u1-solaris-i586.tar.Z
...
# gtar zxvf ../jdk-6u1-solaris-amd64.tar.Z
...
# ls
COPYRIGHT    README.html  SUNWj6dev    SUNWj6dmx    SUNWj6jmp    SUNWj6rt
LICENSE      SUNWj6cfg    SUNWj6dmo    SUNWj6dvx    SUNWj6man    SUNWj6rtx

# pkgadd -d .

  1  SUNWj6cfg     JDK 6.0 Host Config. (1.6.0_01)
                   (i386) 1.6.0,REV=2006.11.29.05.03
  2  SUNWj6dev     JDK 6.0 Dev. Tools (1.6.0_01)
                   (i386) 1.6.0,REV=2006.11.29.05.03
  3  SUNWj6dmo     JDK 6.0 Demo Programs (1.6.0_01)
                   (i386) 1.6.0,REV=2006.11.29.05.03
  4  SUNWj6dmx     JDK 6.0 64-bit Demo Programs (1.6.0_01)
                   (i386) 1.6.0,REV=2006.11.29.02.51
  5  SUNWj6dvx     JDK 6.0 64-bit Dev. Tools (1.6.0_01)
                   (i386) 1.6.0,REV=2006.11.29.02.51
  6  SUNWj6jmp     JDK 6.0 Man Pages: Japan (1.6.0_01)
                   (i386) 1.6.0,REV=2006.12.07.19.34
  7  SUNWj6man     JDK 6.0 Man Pages (1.6.0_01)
                   (i386) 1.6.0,REV=2006.12.07.16.42
  8  SUNWj6rt      JDK 6.0 Runtime Env. (1.6.0_01)
                   (i386) 1.6.0,REV=2006.11.29.05.03
  9  SUNWj6rtx     JDK 6.0 64-bit Runtime Env. (1.6.0_01)
                   (i386) 1.6.0,REV=2006.11.29.02.51

各種質問に応え、先に進みパッケージの追加を完了させます。

# cd /usr
# rm java
# ln -s jdk/instances/jdk1.6.0 java
# java -version
java version "1.6.0_01"
Java(TM) SE Runtime Environment (build 1.6.0_01-b06)
Java HotSpot(TM) Client VM (build 1.6.0_01-b06, mixed mode, sharing)

# vi ~/.bashrc
JAVA_HOME=/usr/java
PATH=${JAVA_HOME}/bin:${JAVA_HOME}/bin:/usr/sbin:/usr/bin
MANPATH=${JAVA_HOME}/man
export JAVA_HOME MANPATH

# . ~/bashrc

/usr/java/bin 以下のコマンドのテスト

# jrunscript -e "println( new Date() );"
Wed Jun 13 2007 04:51:21 GMT+0900 (JST)

# jps -v
16992 Jps -Dapplication.home=/usr/jdk/instances/jdk1.6.0 -Xms8m


オンラインマニュアルのテスト
# man jrunscript
ユーザーコマンド                                    jrunscript(1)

名前
     jrunscript - コマンド行スクリプトシェル
...

--

#2: Application Serverのインストール (アップデート)

Solaris 10 (11/6)にプレインストールされいてるApplication Sreverは8.0 Platform Editionなので、これをアップデート(新規インストール)します。

Update (2007/12/21)
GlassFish v2UR1, Sun Java System Application Server 9.1 Update 1がリリースされています。そちらをすすめます。

Update (2007/10/3)
現時点で、JDK6上で稼働するApplication Serverは、GlassFish v2 b58gとSun Java System Application Server 9.1があります。

ベースとなるコードは同じだそうですが、GlassFishはantを使ってインストールし、SJS ASは対話的なインストーラがつけられています。
また、SJS ASにはクラスタリングのオプションとしてHADBが同梱されているパッケージもオプションとして提供されています。HADBはGlassFishプロジェクトのスコープ外となっており現在はオープンソースではありません。また、SJS ASは使用は無料ですがオプションでSunの有償のサポートを受けられ、GlassFishにはそれがありません。

SJS AS用に豊富なドキュメンテーションが公開されています。これは、おそらくGlassFishでも非常に参考になるはずではあります。

また、今後、Application Serverを使うようなソフトウェアを出荷する際のサポート対象は、Sun Java System Application Serverになると思います。具体的には、「対応アプリケーションサーバー: Sun Java System Application Server 9.1、WebLogic, WebSphere, JBossAS...」とリストされGlassFishは含まれない可能性があります。ただ、作成されたアプリケーションはSJS ASでもGlassFishでもよほどコードが離れない限り、両方で動くはずです。

どちらも基本性能は同等で無料で使用できるのですが、比較すると、Sun Java System Application Serverの方がサポートが手厚く付加価値が高いものになっています。(ユーザー登録が必要です)

バージョン情報を見ると、Sun Java System Application Server 9.1はGlassFish build 58gがベースになっているようです。

Sun Java System Application Server 9.1のインストール

# which asadmin
/usr/sbin/asadmin

# asadmin version
Unable to communicate with admin server, getting version locally.
Version = Sun Java System Application Server Platform Edition 8.0.0_01
Command version executed successfully.

# ls
sjsas-9_1-solaris-i586.bin

# chmod +x sjsas-9_1-beta2-solaris-i586.bin

...Update (2008/01/09)....
... JAVA_HOME環境変数を設定しないとインストーラーがCore Dumpする場合があります。...
# JAVA_HOME=/usr/java
# export JAVA_HOME

# ./sjsas-9_1-beta2-solaris-i586.bin
Connecting to X11 server ':0.0'.
Error: Cannot connect to X11 server ':0.0'.
Check that the DISPLAY environment variable is correctly set or try
rerunning this application with the following usage:
'sjsas-9_1-solaris-i586.bin' -console

# ./sjsas-9_1-solaris-i586.bin -console
Have you read, and do you accept, all of the terms of the preceding Software
License Agreement [no] {"<" 戻る, "!" 終了}? yes
Installation Directory [/opt/SUNWappserver] {"<" 戻る, "!" 終了}:

Do you want to create it now or choose another directory?

1. Create Directory
2. Choose New

該当する番号を入力してください。 [1] {"<" 戻る, "!" 終了}

[/usr/jdk/instances/jdk1.6.0] {"<" 戻る, "!" 終了}
Admin User [admin] {"<" 戻る, "!" 終了}:
Admin User's Password (8 chars minimum):
Re-enter Password:
Do you want to store admin user name and password in .asadminpass file in
user's home directory [yes] {"<" 戻る, "!" 終了}?
Admin Port [4848] {"<" 戻る, "!" 終了}:
HTTP Port [8080] {"<" 戻る, "!" 終了}:
HTTPS Port [8181] {"<" 戻る, "!" 終了}:

Please choose installation options.

Do you want to upgrade from previous Application Server version [no] {"<" 戻る, "!" 終了}?

The following items for the product Sun Java System Application Server Platform
Edition will be installed:

Product: Sun Java System Application Server
Location: /opt/SUNWappserver
Space Required: 154.11 MB
-------------------------------------------
Sun Java System Message Queue 4.1
Application Server
Startup

Ready to Install

1. Install Now
2. Start Over
3. Exit Installation

What would you like to do [1] {"<" 戻る, "!" 終了}?

Installing Sun Java System Application Server Platform Edition
|-1%--------------25%-----------------50%-----------------75%--------------100%|

Installation Successful.

Next Steps:

1. Access the About Application Server 9.1 welcome page at:
file:///opt/SUNWappserver/docs/about.html

2. Start the Application Server by executing:
/opt/SUNWappserver/bin/asadmin start-domain domain1

3. Start the Admin Console:
http://localhost:4848

Please press Enter/Return key to exit the installation program. {"!" 終了}

インストールが完了しましたが、PATHが古いApplication Serverの管理コマンドを指していますので更新します。

# vi ~/.bashrc
PATH=/opt/SUNWappserver/bin:${JAVA_HOME}/bin:${JAVA_HOME}/bin:/usr/sfw/bin:/usr/sbin:/usr/bin

# . ~/.bashrc
# which asadmin
/opt/SUNWappserver/bin/asadmin

# asadmin version -v
Unable to communicate with admin server, getting version locally.
Version = Sun Java System Application Server 9.1 (build b58g-fcs)
Command version executed successfully.

--

#6: 開発環境 Java EE SDKのインストール

配備先のサーバーの環境が定まったらそれにあわせた開発環境を導入します。

  • JDK 6.0
  • Sun Java System Application Server 9.1
  • NetBeans 5.5.1

Java EE SDK がSunより提供されており、たくさんの開発リソースがパッケージングされています。
NetBeans 5.5.1 + JDK6
Application Server 9.1 + JDK6 ( Java EE SDK )
双方のパッケージはあるのですが、3つ、つまり、
JDK6 + Application Server 9.1 + NetBeans 5.5.1
をまとめたものはありませんので、まず、 Java EE SDK からインストールし、その後NetBeansを設定します。
(この情報は古くなっています。以下のUpdateを参照のこと)

Update (2007/12/21)
Netbeans 6.0がリリースされています。

これで、次の構成が最新の状態となります。
JDK6
Netbeans6
GlassFish v2UR1 ( or Sun Java Syste Application Server 9.1 Update 1)
--

UPDATE (2007/10/2)
Netbeans 6 Beta1がリリースされています。2007年11月正式リリースというスケジュールなので、それを待つことになりそうです。
Beta1はかなり使いやすく、期待大です。

[ JDK 6 with Java EE ]: http://java.sun.com/javase/downloads/index.jsp

インストール手順は、Application Serverインストール時とほぼ変わりません。
デフォルトのインストールディレクトリが、/opt/SDK となります。
NetBeansをセットアップすれば、Application ServerとのやりとりはIDEから可能ですが、NetBeansと切り離しても制御できるようにしておくと良いでしょう。

# vi ~/.bashrc
PATH=/opt/SDK/bin:/opt/SDK/jdk/bin:/usr/sfw/bin:/usr/sbin:/usr/bin

# which asadmin
/opt/SDK/bin/asadmin

# asadmin version
Unable to communicate with admin server, getting version locally.
Version = Sun Java System Application Server 9.1
Command version executed successfully.

# which java
/opt/SDK/jdk/bin/java

# java -version
java version "1.6.0_01"
Java(TM) SE Runtime Environment (build 1.6.0_01-b06)
Java HotSpot(TM) Client VM (build 1.6.0_01-b06, mixed mode)

アプリケーションサーバーの起動と停止
# asadmin start-domain
Starting Domain domain1, please wait.
Log redirected to /opt/SDK/domains/domain1/logs/server.log.
...
Domain listens on at least following ports for connections:
[8080 8181 4848 3700 3820 3920 8686 ].
...

ブラウザから次のURLへアクセスし動作を確認します。
http://localhost:8080
https://localhost:8181
http://localhost:4848 (Admin Console)

jconsoleからも確認してみます。
# jconsole &

Remote Process: localhost:8686
Username: admin
Password: *******

次に、NetBeansをインストールしApplication Serverへのデプロイができるように設定します。

--

#3: Application Serverのアンインストール (option)

念のため、Sun Java System Application Server 9.1のアンインストールの手順をまとめます。

# cd /opt/SUNWappserver/

# ./uninstall
Connecting to X11 server ':0.0'.
Error: Cannot connect to X11 server ':0.0'.
Check that the DISPLAY environment variable is correctly set or try
rerunning this application with the following usage:
    'uninstall' -console

# ./uninstall -console
Ready to Uninstall

1. Uninstall Now
2. Start Over
3. Exit Uninstallation

   What would you like to do [1] {"<" 戻る, "!" 終了}?

Uninstalling Sun Java System Application Server Platform Edition
|-1%--------------25%-----------------50%-----------------75%--------------100%|


Uninstallation Details:

     Product                                           Result  More Information
 1.  Sun Java System Application Server Platform Edition  Done
Available

2. Done

   Enter the number corresponding to the desired selection for more
   information, or enter 2 to continue [2] {"!" 終了}: 


# cd /
# rm -fr /opt/SUNWappserver/

--

#4: Application Serverの起動と停止

起動

# asadmin start-domain

起動確認

# asadmin list-domains
domain1 running
Command list-domains executed successfully.

# jps -v
17294 PELaunch -XX:+UnlockDiagnosticVMOptions -XX:MaxPermSize=192m -Xmx512m -XX:NewRatio=2 -XX:+LogVMOutput -XX:LogFile=/opt/SUNWappserver/domains/domain1/logs/jvm.log -Dcom.sun.aas.ClassPathPrefix= -Dcom.sun.aas.ClassPathSuffix= -Dcom.sun.aas.ServerClassPath= -Dcom.sun.aas.classloader.appserverChainJars.ee= -Dcom.sun.aas.classloader.appserverChainJars=admin-cli.jar,admin-cli-ee.jar,dbschema.jar,j2ee-svc.jar -Dcom.sun.aas.classloader.optionalOverrideableChain.ee= -Dcom.sun.aas.classloader.optionalOverrideableChain=webservices-rt.jar,webservices-tools.jar,commons-logging.jar,commons-launcher.jar -Dcom.sun.aas.classloader.serverClassPath.ee=Does not exist/lib/hadbjdbc4.jar,/opt/SUNWappserver/lib/SUNWjdmk/5.1/lib/jdmkrt.jar,Does not exist/lib/dbstate.jar,Does not exist/lib/hadbm.jar,Does not exist/lib/hadbmgt.jar,/opt/SUNWmfwk/lib/mfwk_instrum_tk.jar -Dcom.sun.aas.classloader.serverClassPath=/opt/SUNWappserver/lib/install/applications/jmsra/imqjmsra.jar,/opt/SUNWappserver/imq/lib/jaxm-api.jar,/opt/SUNWappserver/imq/lib/fsconte

ブラウザで以下のURLにアクセスしてみます。
通常のコンテンツ
http://localhost:8080
https://localhost:8181

管理サーバー
http://localhost:4848

jconsoleで以下のポートにアクセスしてみます。あるいはローカルであれば、Local ProcessからPELaunchを選択しても良いでしょう。
* FireWallをまたいだリモートホストからのアクセスは要検証

# jconsole &
Remote Process: localhost:8686
Username: admin
Pssowrd: ******

また、この他に次のポートが開いています。
IIOP 3700
IIOPs 3820
IIOPs (SSL Client ) 3920

JMS 7676 , 54692, 54691, 54693

停止

# asadmin stop-domain
Domain domain1 stopped.

--

#5: サンプルアプリケーションの配備

起動と停止が確認できたら、サンプルWebアプリケーションを配備してみます。

/opt/SUNWappserver/samples/quickstart/hello.war

Admin Consoleから
Applications > Enterprise Applications > Web Applications

asadminコマンドから

# asadmin deploy /opt/SUNWappserver/samples/quickstart/hello.war
Command deploy executed successfully.

配備解除はundeploy

# asadmin undeploy hello
Command undeploy executed successfully.

リモートホストからの配備も同様に可能
# ./asadmin deploy --host remote-server --port 4848 --user admin hello.war
Please enter the admin password>
Command deploy executed successfully.

autodeployディレクトリへのペースト

/opt/SUNWappserver/domains/domain1/autodeploy ディレクトリへファイルをコピーしても配備できます。
cp hello.war /opt/SUNWappserver/domains/domain1/autodeploy

配備されたWebアプリケーションは、domain-dir/applications/j2ee-modules に展開されます。

配備されたWebアプリケーションのリストを取得

# asadmin list server.applications.web-module.*
server.applications.web-module.WSTXServices
server.applications.web-module.adminapp
server.applications.web-module.admingui
server.applications.web-module.hello

--

#7: 開発環境 NetBeans 5.5.1の設定

Update ( 2007/12/21 )
Netbeans6がリリースされています。本ページ5.5.1は古いものとなりました。

NetBeans 5.5.1を使用して、Sun Java System Application Serverへ配備を行います。

開発環境に必要なソフトウェアは、サーバー環境に合わせて以下のものを用意します。

JDK 6.0
Sun Java System Application Server 9.1
NetBeans 5.5.1

現在、NetBeans 5.5.1 + Application Server 9.0U1がバンドルされているパッケージがNetBeans.orgより配布されているのでそれを使用しても良いかもしれません。NetBeansのインストールは簡単ですので、特に記述しません。

UPDATE (2007/10/2)
Netbeans6 Beta1 + Application Server 9.1 ( Web&Java EE )がリリースされています。

インストール後、Server ManagerからApplication Serverを追加します。直接リモートサーバーへのデプロイしたいので、"Register Remote Server"を選択します。

Admin Consoleのホスト名、ポート番号、管理者のユーザー名、パスワードを入力すると登録が完了し、RunTimeパネルから参照できるようになります。

新規Webアプリケーションプロジェクトを既存のサンプルアプリケーションから作成してみます。
Location: /opt/SUNWappserver/samples/quickstart/src/conf
Project Name: remote-hello
Project Folder: ~/remote-hello
Server: 上記で追加したサーバー設定
Context Path: /remote-hello

プロジェクトを構築し、実行すると自動的にリモートサーバーにデプロイされます。

ローカルドメインも追加し、必要に応じてローカル、リモートを切り替えながら使用すると便利です。

--

IE6のPNG透過

GIMPやその他のツールで、PNGのアルファチャンネルを指定すると、透明度を画像に持たせることができます。

Microsoft Windows Internet Explorer 7では、PNGのアルファチャンネルを扱えるようになって良いことです。IE6では、透過PNGは次のように表示されてしまいます。IE6のアップデート等で修正されているかどうかは分かりませんが、私のPCに入っているIE6の状況です。

本来、デザイナーは、FireFoxで表示される、次のような表示を期待しているのです。

影の落ちかたがとてもきれいです。私もこのようなサイトを作りたかったので、IE6でもきちんとアルファチャンネルを扱えるようにしようと考えました。

Microsoftのサイトでのアナウンスは次のとおりです。

http://support.microsoft.com/kb/294714/ja

filter: という非標準のCSS属性が必要なようです。これで、標準のCSSとIE用のCSSの2つを切り替える必要がでて、正直うんざりしますが、今までも何度か同じトラブルが起きたので、解決策を調べました。

まずは、次のようにグラフィックスを表示するためのDIVエレメントを用意します。グラフィックスはDIVのスタイル(kdc-header-logo)無いのbackground-imageとして指定します。

< div id="kdc-header-logo" class="kdc-header-logo"> </div>

と言うタグを用意します。
idには、JavaScriptでこのエレメントを見つけるために使用するための名前を指定します。
classには、適応したいスタイルシートを指定します。

標準的な記述のものと、IE用の記述の2つのスタイルクラスを定義します。

===== style.css =====
.kdc-header-logo {
    float: left;
    width: 128px;
    height: 128px;
    background-image: url( images/kdc-new-logo.png );
}

.kdc-header-logo-msie {
    float: left;
    height: 128px; 
    width: 128px;
    filter: 
        progid:DXImageTransform.Microsoft.AlphaImageLoader(
        src='css/images/kdc-new-logo.png');
}
次に、HTMLが読み込まれたら、DIVエレメントのスタイルシートをブラウザによって切り替えます。
===== contents.html=====
<script language='JavaScript'>
            function makeHeader() {
                var headerLogo = document.getElementById( "kdc-header-logo" );
                var appVersion = navigator.appVersion;
                if( appVersion.indexOf( "MSIE" ) == -1 ) {
                    headerLogo.className = "kdc-header-logo";
                } else {
                    headerLogo.className = "kdc-header-logo-msie";
                }
            }
<script>

<body onload='makeHeader();'>
...
--

Project KSMS : 概要

KDC Survey Management System ( KSMS ) をJavaEEで開発しようと考えています。

KSMSは、アンケート集計を行うWebアプリケーションで、まだ詳細には仕様を決めていませんが、社内で起きている一連の業務の流れを支援できるような仕組みを自分なりに考えてみたいと思っています。概ね、次のようなダイアグラムとなります。

実施担当者(Cordinator)は、トレーニング( Event )と評価項目(Survey)を登録する。

  • 実施期間、実施場所、使用機材、実施条件、コース名、参加者人数、インストラクター名、関係者等を設定します。
  • アンケートの評価項目を設定します。

インストラクター(Instructor)は、参加者(Participants)にアンケート(Evaluation)を入力させる。

  • コース終了後、参加者は、アンケートに入力します。
  • 評価項目を細かく設定できれば、コース前のアセスメント、および、コース中のアンケート等も入力できます。

インストラクター、実施担当者、あるいは、関係者(Observer)は、集計、精査(Summerize)された情報を確認する。

  • その回のアンケート結果に加え、コース毎、インストラクター毎の集計結果を確認できます。
  • 結果は、電子メールなどで、規定のフォーマットで、関係者各位に通知されます。
  • 管理者はこれまでの実績を確認できます。

Project KSMS: evaluation UI 部

まずは、参加者がアンケートを登録するインターフェイスから考えていこうと思う。

Event, Surveyからmake evaluation formを通じて入力項目が生成される。入力された評価結果は、evaluationへ記録される。

evaluation UIの入力フォームは、Survey, Eventの項目によって内容が決定され、その結果であるevaluationはそれに基づく。つまり、Event, Surveyのエンティティが決定されなければ、フォームの詳細を決めることができないし、evaluationで保存すべき内容も決定できない。

「データを先に決めるか、フォームを先に決めるか?」と問われれば、一般的な返答は「まずデータを要件を網羅し定義し、それに基づいてフォームが決定される」となるだろうが、現段階であまり詳細に「要件」を決めず、目に見える部分を先に作成し、それを見ながら、エンティティの内容を考えていこうと思う。経験的に、扱うデータの量が増えれば、システムの複雑さは指数関数的に複雑になる。

考慮点1: ユーザー管理について

実際、アンケートは数名から数十名の参加者が同時に評価を送信する。
誰の評価なのかをどこまで判別する必要があるのか?
例えば、同一の参加者が2回以上異なる評価を送信すると、評価結果の信憑性が下がる。
また、いったん送信したものを、やり直したいケースも出てくるだろう。

もっとも厳密なのは、Eventに参加者のプロフィール(名前等の個人を特定できる情報)を登録しておき、それを用いてサインインしてもらうことだ。

このユーザー管理については、別途考慮する必要がある。

考慮点2: インストラクターによる送信状況の監視

参加者のアンケート送信状況を、インストラクターが、ニアリアルタイムで監視でき、トラブルに対応できることが好ましい。

そのようなアプリケーションが必要であるということと、インストラクターのみが、状況を確認できる必要があるので、アクセスコントロールが必要である、という2点について別途考慮する必要がある。

Project KSMS: 評価項目の種類

評価項目の種類にはどのようなものが必要だろうか?

いくつかのタイプをあげる。

数値
数値によるN段階評価。Nの意味(1が低い、5が高い等)も伝える必要がある。

YES or No(Boolean)
「はい」「いいえ」による評価。

複数項目から択一 ( SelectOne)
「A」「B」「C」からどれかひとつを選ぶ。「その他」もオプションとしてあり得る。

複数項目から複数選択 (SelectMany)
「A」「B」「C」から0個以上選ぶ。
または、N個以上選ぶ。

コメント
コメントのみの返答、あるいは、上記の評価に加える。

オプション:適応外
設問が、返答者にとって適応外の場合に除外する。

考慮点:その他の複雑なUIついて

参加者のアンケートフォームであれば、上記のみで概ねカバーできそうであるが、「設問を作成する」インターフェイスはもっと複雑なものとなる。

選択項目を登録したり、どれが必須項目であるかを作成するインターフェイスはより高度で無くてはならない。

この点は、後で検討する。

Project KSMS: UIコンポーネント(ToolKit)の検討

リッチなユーザーインターフェイスを、0から、つまり、HTML, CSS, JavaScript から作成するのは、非常に工数がかかり現実的では無い。特に、対IEとのクロスブラウザでの検証は、かなりの工数を要する。この場合、Microsoft社の開発環境に精通している必要があるだろう。JavaScriptを手作業で書くことは、なるべく避けたい。

商用のコンポーネントものもあるようだが、OpenSource、フリーのものを使用したい。

また、サーバーサイドのWebアプリケーションフレームワークとしては、JSP, JSTL, JSFを使用していきたい。また、あまり、粒度の細かすぎるものは、新しいコンポーネントを設計する際は役立つだろうが、むしろ効率を下げる(つまりJSFをそのまま使った方が楽な場合がある)かもしれない。コンポーネントとしてすぐに使える状態のものが好ましい。

JSF上で使用できるコンポーネント

JBoss RichFaces ( http://labs.jboss.com/jbossrichfaces/ )

Exadale社のAjaxコンポーネントで、JBossがオープンソース化した。同社のajax4jsfをベースに作られている。
RichFaces オンラインデモ: http://livedemo.exadel.com/richfaces-demo/

かなり洗練されたデザインのUIが揃っているが、種類が少ない。ajax4jsfには、デザインされていないたくさんの部品が存在するので、それを組み合わせてコンポーネントとする必要があるかもしれない。
Sunからのリンクが張られている。( https://ajax4jsf.dev.java.net/ )
Ajax4jsf オンラインデモ:http://labs.jboss.com/jbossajax4jsf/demo/index.html

Sun Project WoodStock ( https://woodstock.dev.java.net/index.html )

GlassFishのAdmin Console、あるいは NetBeans Visual Web Packで使用されているコンポーネントをまとめたもののようである。

NetBeans Visual Web Packは、検討を考えたが、複雑なアプリケーションを作ろうと思ったときに、Wizardが吐き出したコードは少し不安であるし、意見が矛盾するようであるが、コードの意味を理解して開発したいところだ。

WoodStockは、適当な粒度である。ローカルでサンプルを動かして見たところ、動作が非常に遅かった。GlassFishのインターフェイスは非常に良くできていて、動作が機敏なので、不思議な気がする。

Project WoodStock オンラインデモ: https://woodstock.dev.java.net/Preview.htm

使用方法は、若干難しい気がしたが、かなり、複雑な操作がサポートされていて、特にテーブル操作はきれいである。Ajax度は低く、デザインされたJSFコンポーネントととらえることができる。

Apache MyFaces ( http://myfaces.apache.org/ )

JSFの実装と、Thomahawk, SandBox等のコンポーネントが含まれている。
基本部品としては種類は豊富だが、デザインはされていないので自分で作成する必要がある。

JavaScript FrameWork Dojoが使えるデモが公開されている。Dojoと統合できれば、コンポーネントは高度になっていくことと思うが、Dojoの使用法を理解する必要が出てきそうだ。

MyFaces Tomahawk オンラインデモ: http://example.irian.at/example-simple-20070615/home.jsf
MyFaces SandBox オンラインデモ: http://example.irian.at/example-sandbox-20070615/home.jsf

Sun Project JMaki ( https://ajax.dev.java.net/ )

JSF上で動く、かなり粗粒度なAjaxコンポーネント。Dojo,Google,Yahooのコンポーネントを使っているようである。見ていて面白いが、アプリケーションを組むために必要なもの全ては用意されていないようである。

Project JMaki オンラインデモ: https://ajax.dev.java.net/nonav/gallery/index.html#0

その他

AjaxFaces: http://www.ajaxfaces.com/
まだ、作成中のようです。

Ajax Baron: http://web2driver.com/ajax/
Ajaxの使いかたを解説しています。
http://demo.web2driver.com/yubin で紹介されているデモは簡単ですが、Ajaxの基本であり、かつ、実用性があります。

Google Web Toolkit: http://code.google.com/webtoolkit/
JSFからは離れますが、Javaでコーディングし、html + JavaScriptを生成するようです。別途検討。

Java and JavaScript


JDK6からjavax.scriptパッケージが追加され、スクリプトを実行する仕組みと、JavaScriptを実行するスクリプトエンジンとして"Mozilla Rhino"が含まれていて、JavaScriptであれば簡単に実行できます。

Java - JavaScriptの連携は、それぞれが世に出始めたころからNetscapeから積極的に実装がでていたのを記憶しています。LiveConnect, LiveWireという名前がつけられ、JavaScriptはサーバーサイドでも応用されていました。

常々、ブラウザに組み込まれているJavaScriptのテクノロジーは素晴らしいと思っています。日常的に使っているブラウザにインタープリターが組み込まれ、ネットワークからダウンロードしたプログラムが実行できるのですから。すごいテクノロジーというのはそれが実現されたときは、それを実行していることを忘れてしまうものなのでしょう。

さらに、このドキュメントを書くためにMozilla Developer Centerのサイトを調べた所、JavaScriptに関するドキュメント(特に日本語)が非常に整理され、充実していると感じました。ブラウザ開発の歴史の長さとコミュニティの努力、Netscapeの遺伝子の継承を感じます。

さて、JDK6にECMAScript準拠のRhino1.6 JavaScriptエンジンが組み込まれたことで、JavaScriptの利用の機会が増しました。以下に簡単なサンプルを示します。

簡単なサンプル

/**
 * HelloScript
 */
package javascriptcall;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

/**
 * JavaからJavaScriptを実行するサンプルプログラム。
 *
 * @author yyamazaki
 * @version 0.1 2007/6/27
 */
public class HelloScript {
    
    public static void main( String[] args ) {
        
        /* 
         * 実行するJavaScriptのコード。
         * 現在の日付を取得し、フォーマットして出力する。
         */
        String javaScriptCode =
                "importPackage( java.util );" +
                "importPackage( java.text );" +
                "var date = new Date();" +
                "var formatter = DateFormat.getDateInstance( DateFormat.FULL );"+
                "println( '現在の日時: ' + formatter.format( date ) );";
        
        /*
         * ScriptEngineをScriptEngineManagerより取得。
         * JDK6では、Mozilla Rhino スクリプトエンジンが含まれている。
         */
        ScriptEngine scriptEngine = 
                new ScriptEngineManager().getEngineByName( "JavaScript" );
        
        /*
         * スクリプトの実行。
         */
        try {
            
            scriptEngine.eval( javaScriptCode );
            
        } catch (ScriptException ex) {
            
            ex.printStackTrace();
            
        }
    }
}

結果は予想どおり、
現在の日時: 2007年6月27日
上記の例では、JavaScriptのコードがJavaのコードに埋め込まれているのですが、外部のファイルに記述すると面白くなってきます。 Javaのコード 単なるランチャー
/**
 * HelloScript2
 */
package javascriptcall;

import java.io.FileReader;
import java.io.FileNotFoundException;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

/**
 * Javaからファイルに記述されたJavaScriptを実行するサンプルプログラム。
 *
 * @author yyamazaki
 * @version 0.1 2007/6/27
 */
public class HelloScript2 {
    
    public static void main( String[] args ) {
        
        /* スクリプトエンジンの取得 */
        ScriptEngine scriptEngine = 
                   new ScriptEngineManager().getEngineByName( "JavaScript" );
        
        /* 
         * ファイルからスクリプトを読み込み実行する。
         * このプログラム(HelloScript2)は、プログラムの内容を知らない。
         */
        try {
            
            FileReader reader = new FileReader( "js/javascript.js" );
            scriptEngine.eval( reader );
            
        } catch( FileNotFoundException ex ) {
            System.err.println( "file not found." );
        } catch( ScriptException ex ) {
            ex.printStackTrace();
        }
    }
}

JavaScriptのコード
/*
 * JavaScriptサンプル
 */

/*
 * パッケージのインポート。
 *
 * java.langは、最初には読み込まれない。
 * クラス単位でのインポートは importClass();
 * JDKで提供されていないパッケージ/クラスを使用する場合は Packages.xxx と指定する。
 */
importClass( java.lang.System );
importPackage( java.util );
importClass( java.text.DateFormat );
importClass( Packages.javascriptcall.MyBean );

var javaVersion = System.getProperty( "java.version" );
var date = new Date();
var formatter = DateFormat.getDateInstance( DateFormat.FULL );

println( javaVersion );
println( formatter.format( date ) );

//MyBeanのstaticメソッドの呼び出し
var myBean = new MyBean();

//メソッドやプロパティには、()なしでアクセスできる。
println( myBean.message );
実行結果
1.6.0_01 2007年6月27日 Hello. This is MyBean.
スクリプトを使用してJavaの操作ができるので、楽しくなってきます。コンパイルも必要ありません。 JavaScriptは気軽に記述でき軽快です。加えてJavaが持っている膨大なライブラリを使用できます。 コンパイルの必要がないので、実行ファイルとプログラムファイルは一体となっています。これも、非常に扱いやすいです。 Javaで定義されているメソッドやプロパティにアクセスするときも、単純にドットの表記で利用できます。 しかしながら、実行前に文法や型のチェックが無く、実行時に予期しない動作、期待した変数への代入が実は行われていなかったようなケースがあり、その原因がどこにあるのかを探すのが大変になります。 また、JavaのオブジェクトとJavaScriptのオブジェクトをやりとりする際、文字型や整数であれば特に問題ないのですが、オブジェクトの場合、JavaScript側でどのような状態になっているのかを把握することが困難です。JavaScript側では、あまり、複雑で長いコードを記述するのはためらわれます。 Javaとスクリプト側で、それぞれどのようにコードを振り分ければ良いのかはデザインする際に面白いテーマだと思います。 また、Rubyは現在JDKに含まれていませんが、JRubyを使うと、比較的簡単に利用できそうです。 ちなみに、scripting.dev.java.netをみると、Rubyの他にも・・・
  • awk (興味有り)
  • BeanShell
  • Groovy
  • Jelly
  • Pnuts
  • Phython
  • Tcl
  • Velocity (興味有り)
  • PHP
等など・・・強力です。 また、JavaFXもスクリプトのひとつだそうです。 この仕組みを、サーバーサイドで利用できないか思案しているのですが、大型のフレームワークとしてProject Phobosというのが立ち上がっています。 スクリプト言語とJavaのコラボレーションは、開発に様々なオプションが生まれることになり、大歓迎です。
参考URL JDK6 Document http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/scripting/progr... Mozilla Developer Center -JavaScript- [日本語が充実している] http://developer.mozilla.org/ja/docs/JavaScript Mozilla-Japan Rhino: JavaによるJavaScript http://www.mozilla-japan.org/rhino/

SyntaxHighlighter from Google Code.

こんなのがあったらいいな・・・と思いつついろいろさがしていたら、これだというものを見つけることができました。
Google Codeで開発/共有されているSyntaxHighlighterは、非常に便利で優れています。

プログラムコードを書き、それをWebで公開する時のフォーマットにはいつも考えさせられ、なかなかきれいにいきませんし、場当たり的にスタイルシートを書いていますが、SyntaxHighligherを使えばとてもきれいに公開できます。

/**
 * @author yyamazaki
 */
public class Main {
    public static void main( String[] args ){
        String helloWorld = "Hello World!";
        System.out.println( helloWorld );
    }
}
左上の、"view plain"をクリックすると、コピーペースト可能なプレーンなテキストを取得できますし、"copy to ..."でクリップボードに直接コピーすることもできます。 利用は簡単で、まず、ソフトウェアをダウンロードすると、Styles, Scriptsというディレクトリがあるので、Webサーバーの適当な場所にコピーします。 コンテンツにStyles/SyntaxHighlighter.cssをCSSとしてリンクします。
   <head>
       <link type="text/css" 
             rel="stylesheet" 
             href="/Styles/SyntaxHighlighter.css">
       </link>
   </head>
  
ついで、ハイライトしたいコードを次のタグで囲みます。
  <pre name='mycode' class='java'>
  .... Javaのコード ....
  </pre>
name='mycode'には適当な識別名を指定します。 class='java'には対象言語の別名(java,cpp,c#,css,html,sql,javascript etc...)を指定します。 その下(preタグの後)に、JavaScriptを実行するコードを埋め込みます。
        <script class="javascript" src="/Scripts/shCore.js"></script>
        <script class="javascript" src="/Scripts/shBrushJava.js"></script>

        <script class="javascript">
                dp.SyntaxHighlighter.ClipboardSwf = '/Scripts/clipboard.swf';
                dp.SyntaxHighlighter.HighlightAll('my-code');
        </script>
HighlightAll('my-code')には、preタグで指定した名前を指定します。読み込むJavaScriptは言語毎に用意されています。上記はcodeがjavaの場合です。shCore.jsは常に必要になるようです。 とにかく、使いかたが簡単で、カスタマイズもスタイルシートやスクリプトの中を見ればなんとかなりそうです。 やりかたがスマートで気に入っています。

#8: JavaDB (Derby) の利用と設定


JDK6およびGlassFish,Sun Java System Application Server 9.xには、JavaDB, Apache Derby )が付属してきます。もともとはIBMのCloudscapeというPureJavaのRDBMSがオープンソースになったものですが、ANSI SQLに準拠したRDBMSがこのように容易に入手でき使えるという状態は素晴らしいことです。

@注釈: JDK 6u2からJavaDBのインストール場所が変わっています。

Javaで開発を行う場合、別途、データベースの設定をしなくてもJDK6だけでSQLによる永続化のメカニズムを使用できます。

しかし、すぐそこにあるのに実際使おうとすると、案外うまくいきません。ここに、使いかたを整理します。

Sun Java System Application Serverからの起動と停止

asadminコマンドから、JavaDBを起動、停止できます。

# asadmin start-database
次のホストの接続を確立しました: 0.0.0.0、ポート番号 1527。
Apache Derby Network Server - 10.2.2.0 - (485682) は、2007-06-27 13:52:49.231 GMT にシャットダウンしました。
Command stop-database executed successfully.
[root@shilver opt]# asadmin start-database
Database started in Network Server mode on host 0.0.0.0 and port 1527.
--------- Cloudscape Network Server 情報 --------
バージョン: CSS10020/10.2.2.0 - (485682) ビルド: 485682 DRDA 製品 ID: CSS10020-- listing
...
Starting database in the background.
Log redirected to /opt/SUNWappserver/databases/derby.log.
Command start-database executed successfully.
#

デフォルトで、

  • JavaDBのJarファイル: <AS_INSTALL>/javadb/lib
  • データベースディレクトリの場所: <AS_INSTALL>/databases
  • 待機ポート番号: 1527

という設定で、立ち上がり、最初はデータベースが何もない状態ですが、利用できる状態にあります。

データベースファイルの場所をデフォルトから変更するには、--dbhome=を指定します。

# asadmin start-database --dbhome=/javadb/database

JavaDBを停止するには

# asadmin stop-database
次のホストの接続を確立しました: 0.0.0.0、ポート番号 1527。
Apache Derby Network Server - 10.2.2.0 - (485682) は、2007-06-27 14:12:28.249 GMT にシャットダウンしました。
Command stop-database executed successfully.
#

asadminコマンドでは、起動時のJVMのオプションを変更するとか簡単にはいかないようですし、指定できるオプションも限定されます。開発時はこれで良いでしょうが、運用時はマニュアルで操作したいと思うでしょう。

その場合、いくつかのコマンドが用意されています。

JavaDB関連のファイルは次の場所にあります。

JDK6: <JDK_INSTAL_DIR>/db/
Application Server: <AS_INSTALL_DIR>/javadb

それぞれの下には、lib/ と frameworks/ というディレクトリがあります。

  • lib/ JDBCドライバーやサーバ関連のjarファイルが
  • framework/ コマンド類

が納められています。各種コマンドを使うには、環境変数 DERBY_HOME とframeworks以下のコマンド類を使用するためのPATHの設定を行います。

export DERBY_HOME=/opt/SUNWappserver/javadb
PATH=....${DERBY_HOME}/frameworks/NetworkServer/bin

この設定をシェルに反映させると、frameworks/NetworkServer/bin以下にあるコマンド類が使えるようになります。これらの用意されているコマンドはJavaのプログラムを実行するためのシェルスクリプトで、引数やクラスパスなどの環境変数を設定した上で、クラスを実行しています。

サーバーの起動と停止を行うコマンドは、NetworkServerControl.kshというコマンドです。

起動
# NetworkServerControl.ksh start

停止
# NetworkServerControl.ksh shutdown

のように、使用することができます。
ただ、デフォルトで起動すると、データベースディレクトリがカレントディレクトリになってしまいます。つまり、コマンドを起動した場所によって、データの配置場所が変わってしまい良くありません。
ですから、例えば、/opt/SUNWappserver/databasesの用に適当な場所に定めた方が良いでしょう。

NetworkServerControl.ksh に -Dderby.system.home=...... というプロパティを追加します。

# ---------------------------------------------------------
# -- start Derby Network Server
# ---------------------------------------------------------

"$JAVA_HOME/bin/java" -cp "${DERBY_HOME}/lib/derby.jar:\
${DERBY_HOME}/lib/derbytools.jar:\
${DERBY_HOME}/lib/derbynet.jar:${CLASSPATH}" \
-Dderby.system.home=/opt/SUNWappserver/databases \
org.apache.derby.drda.NetworkServerControl $*

これで、データベースロケーションを定位置にすることができます。

起動
# nohup NetworkServerControl.ksh start &

動作確認
# NetworkServerControl.ksh ping
次のホストの接続を確立しました: localhost、ポート番号 1527。

停止
# NetworkServerControl.ksh shutdown
Apache Derby Network Server - 10.2.2.0 - (485682) は、2007-06-27 15:48:07.968 GMT にシャットダウンしました。

開発やデモの時はasadminコマンドを使用して、運用系になったらこのコマンドを使用した方が良さそうです。

データベースの作成

JDBCか、提供されているコマンドを使用してデータベースを作成します。

何もオプションが設定されていない状態でのJavaDBでは、認証の必要なく自由にデータベースを作成できます。(できてしまいます)

まずは、コマンドでの作成例をあげます。
ij.ksh というコマンドが用意されていますので、それを用いてデータベースを作成します。

# ij.ksh
ij バージョン 10.2
ij> connect 'jdbc:derby://localhost/newDB;create=true';

newDBというデータベースが作成される。

データベース内のスキーマを表示する。

ij> show schemas;
TABLE_SCHEM
------------------------------
APP
NULLID
SQLJ
SYS
SYSCAT
SYSCS_DIAG
SYSCS_UTIL
SYSFUN
SYSIBM
SYSPROC
SYSSTAT

ij> exit;

/opt/SUNWappserver/databases ディレクトリ以下にnewDB/というディレクトリができます。それが、データベース領域です。データベースを削除するコマンド(drop database)は無いようです。削除の際はこのディレクトリを削除します。また、単純バックアップは、これをコピーしておけばリストアできます。

認証の有効化

初期状態ではJavaDBは認証を行わず、誰でもアクセスできてしまいます。
データベースにアクセスする際の認証を有効にするには、derby.system.homeで指定されたディレクトリに、derby.propertiesという設定ファイルを配置しておき、次のように設定します。

/opt/SUNWappserver/databases/derby.properties

#
# 認証の設定
#
derby.connection.requireAuthentication=true
derby.authentication.propvider=BUILTIN

#
# アクセス権の設定
#
derby.database.fullAccessUsers=admin,yamazaki,app
derby.database.readOnlyAccessUsers=guest

#
# ユーザーのリスト
#
derby.user.yamazaki=helloderby
derby.user.admin=admin
derby.user.app=app
derby.uesr.guest=guest

サーバーを再起動します。

ijを使用して、先ほど作成したデータベースに接続を試みると失敗します。

# ij.ksh
ij バージョン 10.2
ij> connect 'jdbc:derby://localhost/newDB';
エラー 08004: 接続認証の障害が発生しました。 理由: ユーザー ID またはパスワードが無効です。
ij>
derby.propertiesに設定したユーザーを指定する。
ij> connect 'jdbc:derby://localhost/newDB;user=yamazaki;password=helloderby';
ij>
認証に成功し、データベース作成と接続が完了する。

通常の感覚だと、認証有りの状態がわかりやすいと思われます。

ネットワークのセキュリティ

# nohup NetworkServerControl.ksh start &
で、起動した場合、セキュリティのためローカルなコンピュータからしか接続できません。
ネットワーク接続を受け入れる場合は、-h myHostname と指定し起動する必要があります。

# nohup NetworkServerControl.ksh start -h myHostname.example.com &

もし、マルチホームゲートウェイのように複数のIPアドレスが割り振られていている場合は、指定したホストと対応づけられているIPアドレスと対応するNetworkインターフェイスからしか受け付けないようです。-h オプションは複数指定できました。

もし、全てのホストからの接続を受け入れる場合、-h 0.0.0.0 と指定します。

# nohup NetworkServerControl.ksh start -h 0.0.0.0 &

asadminコマンドではデフォルトで 0.0.0.0 が指定されます。(危ないのでは・・・?)
接続を許可するホストは --dbhost オプションで指定できるので、ローカルホストに接続を限定したいときは、

# asadmin start-database --dbhost localhost

とするのが良さそうです。

ユーザーとスキーマ

データベース内のオブジェクト(例えばテーブルやビュー、トリガーなど)はスキーマに属します。スキーマによりそれが誰の所有物であるのかを明確にでき、スキーマレベルで権限を設定できます。オブジェクトはスキーマとあわせて次のように表されます。

schema.object

認証を行いデータベースに接続し、オブジェクトを作成すると、そのオブジェクトはそのユーザーのスキーマとして定義されます。
例えば、admin ユーザーで認証しテーブルSAMPLE_TALBEを作成すると、ADMIN.SAMPLE_TABLES となりadminのスキーマとしてテーブルが作成されます。自分のスキーマを操作する場合は、スキーマの指定は省略可能ですので、adminがADMIN.SAMPLE_TABLESを利用する場合は単にSAMPLE_TABLESと指定できますが、他のユーザーの所有物、つまり、他のadmin以外のスキーマにアクセスする際はSYS.SYSTABLESのようにスキーマの指定が常に必要になります。

最初から用意されているSYSで始まるスキーマは、システムで保守されるスキーマです。また、認証無しでアクセスできる状態では、接続した場合、APPというスキーマがデフォルトのスキーマとして割り当てられます。APPというスキーマは最初から用意されています。

オブジェクトの作成

テーブル等をオブジェクト作成は、SQLで行うことができます。

# ij.ksh
ij バージョン 10.2
ij> connect 'jdbc:derby://localhost/newDB;user=yamazaki;password=helloderby';

ij> show schemas;
TABLE_SCHEM
------------------------------
APP
NULLID
SQLJ
SYS
...
ij>

テーブルの確認
ij> show tables;

TABLE_SCHEM         |TABLE_NAME                    |REMARKS
------------------------------------------------------------------------
SYS                 |SYSALIASES                    |
SYS                 |SYSCHECKS                     |
...

テーブルの作成
ij> create table SAMPLE_TABLE ( name varchar(50) );
0 行が挿入/更新/削除されました

作成したテーブルの確認
ij> show tables;

TABLE_SCHEM         |TABLE_NAME                    |REMARKS
------------------------------------------------------------------------
...
YAMAZAKI            |SAMPLE_TABLE                  |

ij> describe sample_table;
COLUMN_NAME         |TYPE_NAME|DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL&
------------------------------------------------------------------------------
NAME                |VARCHAR  |NULL|NULL|50    |NULL      |100       |YES

ij>

自分のスキーマオブジェクトにアクセスる際は、オブジェクト名のスキーマの指定は省略できますが、別のユーザーが他のユーザーのスキーマにアクセスする際はスキーマの指定は必須になります。

例えば、adminというユーザーで接続し、上で作成したSAMPLE_TABLEにアクセスすると存在しないというエラーとなります。この場合、スキーマを指定しなくてはなりません。

# ij.ksh
ij バージョン 10.2
ij> connect 'jdbc:derby://localhost/newDB;user=admin;password=admin';
ij> describe sample_table;
IJ エラー: SAMPLE_TABLE という名前の表は存在しません

ij> describe yamazaki.sample_table;

COLUMN_NAME         |TYPE_NAME|DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL&
------------------------------------------------------------------------------
NAME                |VARCHAR  |NULL|NULL|50    |NULL      |100       |YES

1 行が選択されました
ij>

まずは、JavaDBの基本的なセットアップが行えるようになります。

ijの設定に関して

ijは、org.apache.derby.tools.ijというクラスで実装されていて、ij.kshコマンドは各種オプションをつけ、javaを使ってそのクラスを実行しています。

提供されているij.kshの内容の一部

export IJ_HOST=localhost
export IJ_PORT=1527
export IJ_USER=APP
export IJ_PASSWORD=APP

# ---------------------------------------------------------
# -- start ij
# ---------------------------------------------------------
"$JAVA_HOME/bin/java" -cp "${DERBY_HOME}/lib/derbyclient.jar:${DERBY_HOME}/lib/derbytools.jar:${CLASSPATH}" -Dij.driver=org.apache.derby.jdbc.ClientDriver -Dij.protocol=jdbc:derby://$IJ_HOST:$IJ_PORT/ -Dij.user=$IJ_USER -Dij.password=$IJ_PASSWORD org.apache.derby.tools.ij

ijには様々なオプション(プロパティ)が指定できます。
もし、自動的にログインしたければ、次のように変更するか、または、自分でスクリプトを書いても良いでしょう。

提供されているij.kshをコピーし、一部を変更したmyij

...
"$JAVA_HOME/bin/java" \
-cp "${DERBY_HOME}/lib/derbyclient.jar:${DERBY_HOME}/lib/derbytools.jar:${CLASSPATH}" \
-Dij.driver=org.apache.derby.jdbc.ClientDriver \
-Dij.protocol=jdbc:derby://$IJ_HOST:$IJ_PORT/ \
-Dij.connection.myconnection=newDB \
-Dij.user=yamazaki \
-Dij.password=helloderby \
org.apache.derby.tools.ij

-Dij.connection.myconnection に、ij.protocol以下のURLを記述しておけば、起動時に自動的にログインするようになります。

# ./myij
ij バージョン 10.2
MYCONNECTION* - jdbc:derby://localhost:1527/newDB
* = 現行接続
ij>

スクリプトの実行

ijを使用して、ファイルに記述されたSQLを実行する場合、ijの引数にデータベーススクリプトを実行できます。

残念ながij.kshコマンドは、引数がしていできるようには作られていません。よって、以下のように変更します。

...
"$JAVA_HOME/bin/java" \
-cp "${DERBY_HOME}/lib/derbyclient.jar:${DERBY_HOME}/lib/derbytools.jar:${CLASSPATH}" \
-Dij.driver=org.apache.derby.jdbc.ClientDriver \
-Dij.protocol=jdbc:derby://$IJ_HOST:$IJ_PORT/ \
-Dij.connection.myconnection=newDB\
-Dij.user=yamazaki \
-Dij.password=helloderby \
org.apache.derby.tools.ij $@

実行するときは、

# ./myij script.sql

または、
# ./myij < script.ij

として実行できます。前者の実行方法ではスクリプトファイルには、SQLしか含めることができません。
後者は、ijのコマンドを指定できます。

サンプルSQLファイル (dbscript.sql)

drop table test3;
create table test3( id int, name varchar(50) );
insert into test3 values( 1, 'a' );
insert into test3 values( 2, 'b' );
insert into test3 values( 3, 'c' );

これを実行します。

# ./myij dbscript.sql
ij バージョン 10.2
MYCONNECTION* - jdbc:derby://localhost:1527/newDB
* = 現行接続
ij> drop table test3;
0 行が挿入/更新/削除されました
ij> create table test3( id int, name varchar(50) );
0 行が挿入/更新/削除されました
ij> insert into test3 values( 1, 'a' );
1 行が挿入/更新/削除されました
ij> insert into test3 values( 2, 'b' );
1 行が挿入/更新/削除されました
ij> insert into test3 values( 3, 'c' );
1 行が挿入/更新/削除されました

または、

# ./myij < dbscript.sql
ij バージョン 10.2
MYCONNECTION* - jdbc:derby://localhost:1527/newDB
* = 現行接続
ij> 0 行が挿入/更新/削除されました
ij> 0 行が挿入/更新/削除されました
ij> 1 行が挿入/更新/削除されました
ij> 1 行が挿入/更新/削除されました
ij> 1 行が挿入/更新/削除されました

以上で、ひとまず、JavaDB, Derbyは使えるようになると思います。
なかなか、大変ですが、このPure JavaのデータベースはJDKともに配布されていて、JDKがインストールされていればすぐに利用可能なので、是非、利用法は掴んでおきたい所です。

dblookスクリプトとUnix (Update 2008/7/31)

dblookスクリプトを使用すると、データベース内のスキーマ(DDL)が確認できますが、Unixでそれを実行すると認証に失敗します。
調査したところ、シェルのクォートの問題で、次のように指定しなくてはなりません。

./dblook -d "'jdbc:derby://localhost:1527/booksdb;user=booksdb;password=booksdb'"

つまり、;(セミコロン)を含むJDBC URLをシングルクォートされた状態で渡さなくてはなりません。

ここまで書いてきて私が感じたのは、設定ファイルがどこにあるのかを見つけるのが大変で、一見起動は簡単なように見えるのですが、どのような状態で起動しているかを理解するのが難しいということと、フロントエンドであるijがあまり便利では無いということです。

MySQLにはmysqlコマンドが、Sybaseにはisqlが、OracleにはSQLPlusがあり、それなりに便利ですが、ijは、対話的な利用ではなんとなく使いにくい。または、別のリッチなフロントエンドを想定しているでしょう。少なくともコマンドラインでのヒストリがあればいいなと思います。

ですが、今回、かなりクリアになりました。あとは、シンプルな手順を考えたいと思います。

#9: NetBeansからJavaDBを使用する

開発時は頻繁にデータベースにアクセスする必要があります。ijのようなコマンドラインからスクリプトを実行するという方法も悪くありませんが、NetBeansから制御できるようにしておくと便利です。

Update (2007/12/21)
Netbeans6がリリースされています。本情報は古いものとなりました。

Tools > Options > Advanced Options を選択。
Options > IDE Configuration > Server and External Tool Set > Java DB Database を選択

Java DB Location にはJavaDBのライブラリディレクトリを指定: e.g. /opt/SUNWappserver/javadb/lib
Database Location にはデータベースファイルを保存するディレクトリを指定: e.g. /opt/SUNWappserver/databases

これで、NetBeansがデータベースを見つけ起動停止できるようになります。

コメント:・・・Java DB Database は、わかりやすいとは思うのですが、DB means Data Base なので、Java DataBase Database で意味が繰り返していて抵抗がある。Java DB Serverに統一するかRDBMSとかDBMSとか・・・

Tools > Java DB Database > Start Java DB Server

を選択すると、JavaDBが起動する。

Apache Derby Network Server - 2007-06-27 19:09:21.673 GMT に 10.2.2.0 - (485682) が開始され、ポート 1527 で接続を受け入れる準備ができました。

もし、JavaDBにデータベース領域を作成していなかったら、次のように新規に作成します。

Tool > Java DB Database > Create Java DB Database

Database Name: 任意のデータベース名
User Name: JavaDBにアクセスできるユーザー名
Password: パスワード

上記のユーザー名とパスワードは、前述の認証の設定を行っていなければ、スキーマAPPによるアクセスとなりあまり意味がありません。

Runtime ウィンドウ内の[Databases]を開きます。

もし、NetBeansからデータベースを新規に作ったのであれば、接続定義がひとつ作られています。
もし、無ければ、接続定義を作成するために、Databases上で右クリックしNew Connection...を選択します。

設定すると、次のように使用するスキーマを聞いてくるのですが、初めてのユーザーの場合は選択するものがありませんので、とりあえずAPPを選択しておきます。

Runtimeウィンドウに接続定義が表示されます。後は、右クリックで Connect...とすればデータベースに接続できます。

もし、前の手順で暫定的にスキーマをAPPにした場合は接続の前に、Propertiesを選択し、Schemaを任意のものに変更すると良いでしょう。JavaDBではスキーマ名は大文字と小文字を区別します。そして、接続ユーザーのデフォルトのスキーマは全て大文字になります。ちょっと奇妙でわかりにくいのですが、例えば、ユーザ名がyamazakiの場合はYAMAZAKIと指定すると良いでしょう。

後は、SQLコマンドを実行したり、テーブルを作成したり、表示したり、スクリプトを実行したりすることができます。

実行したいスクリプトを、プロジェクトディレクトリに作成しておきの拡張子に.sqlを指定しておきます。そのファイルを右クリックし、開き、Connectionを選択し、"Run SQL"ボタンでスクリプトを実行することができます。

スクリプトに限らず、SQL文中のテーブル名やカラム名等はダブルクォートで括っておかないと全て大文字になるようなので注意が必要です。可能であれば、基本的にはクォートせずに、常に大文字で記述した方が良いような気がします。

これで、開発時、JavaDBを使用できるようになると思います。

#10: DataBase Frontend, Excecute Query Project (Option)

かなり以前から、「あったらいいな」と思っていたもののひとつが、Javaで動作する汎用的なRDBMSのフロントエンドです。商用(Minq Software DBVisualizer)、フリー( SQuirreL SQL Client, HSQLDB付属のクライアント,MySQLのGUIツール,OpenOfficeのデータベース接続機能等)存在したのですが、また新しい有力な候補が見つかりました。

"Execute Query"というGPLベース、オープンソースのJavaで作られたJDBCベースのフロントエンドユーティリティです。Debian上でNetBeansを使用して開発されているようです。

多少、動かなくなるような経験をしましたが、とにかく非常にしっかりとつくられ、よく設計されているように感じますし、この先に期待できそうです。JavaDB, Derbyは、HSQLDBのようにGUIのフロントエンドを持っていませんので、Derby + ExcuteQueryのコンビはとてもきれいに、素敵に見えます。

スナップショットをとったので、リストします。

JDBCドライバ登録。

SQLの実行と結果

全件検索

Entity Relationship Diagram

テーブルの編集

開発時はNetBeansが使えそうですが、管理運用では、やはりコマンドラインからのバッチが有効ですが、単独で動いているRDBMSのデータの状態把握には便利そうです。

#11: Book End JavaEE開発の準備 まとめ

シンプルなJavaEE開発環境の設定手順に関して記してきました。

常にバージョンアップが想定されるため、今度はここでセットアップしたソフトウェアをアップデートしていく必要が出てくると思いますので、その時は内容を、追加、変更していきたいと思います。また、今回の内容には、ソースコードのバージョン管理に関しては触れませんでしたが、必須となるでしょう。

一人で開発する際は、特に難しいことを考える必要はないのですが、複数人での開発に参加は統制をとるのが大変になってきますので、プロジェクト管理の流れを検討する必要が出てくるでしょう。そうなった時のことも想定しつつ作業を進めていきたいと思います。

CVSやSubversionのようなバージョン管理システムに関してはNetBeansでもサポートされていますし、機会があったらセットアップ方法をまとめておきたいと思います。

また、課題管理、バグ追跡システム、Mavenのようなビルドツールなど、プロジェクト管理関連のツールやシステムも検討する必要があるかもしれませんが、まずは、基盤となる環境を作る手順を見てきました。

Project KRMS

Project KSMS (KDC Survey Management System)を作成中であったが、その前に受付を行うためのRegistration Systemを先に作成することにしました。

完成を急いでいるので、簡単なダイアグラムを作成し、既にコーディングしています。

JDK 6 Update2 がつい先日リリースされました。
http://java.sun.com/javase/6/webnotes/ReleaseNotes.html
たくさんのバグフィックスを含んでいるようです。

この中で、JavaDBのインストール場所が変わっていました。
以前は、インストールディレクトリの、dbというディレクトリ以下にあったものが、リリースノートを見る限り、

Solaris: /opt/SUNWjavadb
Linux: /opt/sun/javadb
Windows: C:\Program Files\Sun\JavaDB

に変わるそうです。・・・分かりました、了解です。

しかしながら、Linux版の"self extracting file"形式だと、JavaDBが含まれていません。おそらく、各OSのインストーラーを使えば、上記の場所に配布してくれるのでしょうが・・・。

あるディストリビューションでは、JavaDBが入っていないので、結局、derbyやJavaDBをダウンロードしていれることになります。入れるのは簡単です。コピーすれば良いのです。

ですが、場所が定まらないのは、気になります。

JavaDBは、Sunの様々なパッケージに含まれています。

  • JDK
  • GlassFish
  • JavaEE SDK
  • Sun Java System Enterprise System

これに加え、NetBeans + JavaEE とか、NetBeans + JDK とか、いろいろな組み合わせが出てきます。

JDKの中にある状態、つまり、/usr/java/db というディレクトリの場所は、混乱しない、良い場所でした。

いまは、どこに、JavaDBがあるのかよくわからない状態になってしまいかねません。

結局、いろいろなディストリビューションに付属してくるJavaDBを使わずに、単独でダウンロードして使ったほうが良いかもしれません。

Book: Java Persistence API

*2006/11/4のKBlogからの転記

Java EE 5, GlassFish(SJS Application Server 9.xPE), NetBeans 5.5の組み合わせは、非常にパワフルです。個人が全体を把握するのはかなり困難な量になってきていますが、まずは、Persistence APIを見てみます。

Database
データベースは、以下のような単純なテーブルを使用します。
今回は、GlassFishに付属してくるDerbyを使ってみました。
NetBeansからだと非常にスムーズに使えますが、単独だと、CUI(ij)が私にとって使いづらいです。

create table book (
    bookid      int                 primary key,
    title       varchar( 255 )      not null,
    price       int
);
Entity (Annotated POJO) データベースに対応するエンティティクラスを定義します。 アノテーションが指定されたPOJOです。 javax.persistence.* は、GlassFishやJavaEE5 SDKのjavaee.jar含まれています。 以下はストレートなマッピングで、コードは理解しやすく、コンセプトも明確なので、開発者は特別なハーネス無しに作成できそうです。テーブルが複数ありリレーションシップを定義しなければならなくなると、もっと研究が必要になると思われます。
package testpersistence;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "BOOK")

public class Book implements Serializable {

    @Id
    @Column(name = "BOOKID", nullable = false)
    private Integer bookid;

    @Column(name = "TITLE", nullable = false)
    private String title;

    @Column(name = "PRICE")
    private Integer price;
    
    ...以下 getter,setter ...
} 
persistence.xml EntityManagerが使用するPersisntece定義ファイルを作成します。 テンプレートやハーネス無しには作成が難しそうです。 NetBeans のWizardで作成しました。NetBeans および GlassFishにはOracleのTopLink Essential(おそらく元WebGainから買収した製品)というO/R Mappingのためのライブラリが付属していて、デフォルトだとそれが使われます。 HibernateやKODO等、別のO/R Mappingも使用できそうなので、今後調べてみたいと思っています。 まずは、TopLinkで進めます。JDBCドライバーや接続情報などの一般的なプロパティが定義されています。 ディレクトリはMETA-INFに、ファイル名はpersistence.xmlとして作成されています。


  
    oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider
    testpersistence.Book
    
      
      
      
      
      
    
  

TopLink Essensialの説明は以下を参考にしてください。 Main 以上で、下準備は完了ですので、実際に利用します。 見てのとおりなのですが、Persistenceクラスのファクトリメソッドを使って、EntityManagerFactoryインスタンスを作成します。 persistence.xml内のpersistence-unitで定義されている名前を指定し、そこから、EntityManagerインスタンスを取得します。 以下の例では、全権検索を行なうクエリをEJB QLで実行しています。
package testpersistence;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class Main {
    private static EntityManagerFactory factory = 
            Persistence.createEntityManagerFactory( "topLinkPersistence" );
    private static EntityManager manager = factory.createEntityManager();
    
    private static String TOPLINK_EJBQL = "SELECT b FROM Book b";

    public static void main(String[] args) {
        
        Query query = manager.createQuery( TOPLINK_EJBQL );
        List<Book> books = query.getResultList();
        for( Book book : books ) {
            System.out.printf( "%5s %-15s %5s", 
				book.getBookid(), 
				book.getTitle(), 
				book.getPrice() );
        }
    }
}
実行 作成された、Book.java, persistence.xml, Mail.javaを実行するために必要なパッケージは、以下のとおりです。 JDBC Driver: derbyclient.jar (from GlassFish) TopLink: toplink-essensials.jar (from GlassFish/Netbeans javax.persistence APIを含む)
# java -cp ../build/classes:/opt/glassfish/javadb/lib/derbyclient.jar:/opt/glassfish/lib/toplink-essentials.jar testpersistence.Main 1 java book 100 2 hibernate book 150 3 unix book 200 4 linux book 300 5 opteron book 120 6 intel book 150 7 windows book 160 8 netbeans book 300 9 ejb book 60 10 hibernate book 110
内部的にどのようなことが起きているのか、特にPOJOに対するAnnotationがどのように機能しているのかは研究する必要がありそうですが、少なくとも、利用する側の視点からはNetBeansと組み合わせると、非常に迅速にO/Rマッピングが可能になります。 NetBeans5.5は非常に高機能になっていて、GlassFishと組み合わせると更に様々な機能が使えるようになります。 データベースとしてDerbyがすぐに利用でき、かつ、データベースのスクリプトを.sqlという拡張子で作成しておくとNetBeansから実行できます。データベースの初期化がIDE上で行なえます。 JDBCの接続をNetBeansに登録しておくと、SQLの実行が行なえるだけでなく、Persistence Wizardで選択可能になり、対応した設定ファイルやPOJOとpersistence.xmlを作成してくれます。 参考: http://www.netbeans.org/kb/55/app-client-preview.html https://glassfish.dev.java.net/javaee5/persistence/entity-persistence-su...

Book: JPA CRUD Create

*2006/11/4のKBlogからの転記

Persistence API, CRUDのC, Createをストレートマッピングで行ないます。 entityTransaction#begin から commitによるトランザクションでentityManager#persist()を囲みます。

package jpasample;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class BookCreate {
  // META-INF/persisntence.xml内に定義するPersistence Unit名
  private static EntityManagerFactory factory = Persistence.createEntityManagerFactory("topLinkPersistence");
  
  //EntityManagerのインスタンス
  private static EntityManager manager = factory.createEntityManager();
  
  public static void main( String[] args ) {
    
    //非永続化オブジェクト
    Book book = new Book();
    
    book.setBookid( 1 );
    book.setTitle( "Java Book" );
    book.setPrice( 4500 );
    
    //トランザクションの開始
    manager.getTransaction().begin();
    
    //オブジェクトの永続化
    manager.persist( book );
    
    //トランザクションの完了。指定し忘れると永続化されず、かつエラーはでない。
    manager.getTransaction().commit();
  }
}
上記の例は、コンパイルは通りますし、動作しますが、例外に関する対応はしていません。例えば、「プライマリーキーの重複による例外の発生」を避けたければ、次のように記述できます。
package jpasample;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class BookCreate2 {

  private static EntityManagerFactory factory = Persistence.createEntityManagerFactory("topLinkPersistence");
  private static EntityManager manager = factory.createEntityManager();

  public static void main(String[] args) {

    Book book = new Book();

    book.setBookid(1);
    book.setTitle("Java Book");
    book.setPrice(4500);

    //bookid 1を検索。存在すれば非nullが返る。
    if (manager.find(Book.class, 1) != null) {
      System.err.println("bookid 1 は既に存在します。");
    } else {
      manager.getTransaction().begin();
      manager.persist(book);
      manager.getTransaction().commit();
    }
  }
}
entityManager#find()は、プライマリキーから検索を行ないます。ちなみに、サンプルのプライマリーキーはLongとしていますが、JDK5からのAutoBoxingは非常に気持ちよく働きます。

tech-memo.txt

JDK6 SOAP DUMP

# java -version
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing)

# java -Dcom.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump=true HelloClient test
---[HTTP request - http://app.knowd.co.jp:80/testws/HelloWSService]---
Content-type: text/xml;charset="utf-8"
Soapaction: "http://ws.test.knowd.com/HelloWS/getHelloRequest"
Accept: text/xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
test--------------------
---[HTTP response - http://app.knowd.co.jp:80/testws/HelloWSService - 200]---
Transfer-encoding: chunked
null: HTTP/1.1 200 OK
Content-type: text/xml;charset=utf-8
Server: GlassFish v3
X-powered-by: Servlet/3.0
Date: Wed, 27 Jan 2010 17:47:19 GMT
Hello test!--------------------
Hello test!

com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump JSFのエラーログの抑止 javax.enterprise.resource.webcontainer.jsf WARNING
Derbyの起動時に指定されるderby.system.home内にある、derby.propertiesファイルに、 derby.language.logStatementText=true というプロパティを指定しておくと、derby.logファイル内に 2007-02-28 18:02:41.738 GMT Thread[DRDAConnThread_4,5,main] (XID = 15922), (SESSIONID = 37), (DATABASE = trainingdb), (DRDAID = NF000001.D0DE-4268003899177915296{38}), Executing prepared statement: INSERT INTO ADDRESS_T (address_id, address_name) VALUES (?, ?) :End prepared statement with 2 parameters begin parameter #1: 1579092126 :end parameter begin parameter #2: Thu Mar 01 03:02:41 JST 2007 :end parameter と言うような実行されたSQL(PreparedStatement)情報が記録されるようになり、デバッグの際、非常に助かる。
bash-3.00# grep -v ^# /boot/grub/menu.lst default 0 timeout 10 splashimage /boot/grub/splash.xpm.gz title Solaris 10 8/07 s10x_u4wos_12b X86 kernel /platform/i86pc/multiboot module /platform/i86pc/boot_archive title Solaris failsafe kernel /boot/multiboot kernel/unix -s module /boot/x86.miniroot-safe
default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title Fedora (2.6.23.8-63.fc8) root (hd0,0) kernel /vmlinuz-2.6.23.8-63.fc8 ro root=LABEL=/ rhgb quiet initrd /initrd-2.6.23.8-63.fc8.img title Fedora (2.6.23.1-49.fc8) root (hd0,0) kernel /vmlinuz-2.6.23.1-49.fc8 ro root=LABEL=/ rhgb quiet initrd /initrd-2.6.23.1-49.fc8.img

Book: JPA CRUD Read

*2006/11/4のKBlogからの転記

Persistence API, CRUDのR, Readをストレートマッピングで行ないます。 Persistence APIではQuery Languageが定義されています。 HibernateであればHQLという問い合わせ言語が使えました。 JavaEE5では、"Java Persistence Query Language"として規定されています。( AKA EJB QL ?)

言語に関するスペックは以下のページで説明されていて、一般的な問い合わせ機能(例えばORDER BY等やCOUNT()等の集計関数)は一通り網羅されているようです。
http://java.sun.com/javaee/5/docs/tutorial/doc/QueryLanguage.html#wp8058...
プライマリーキーによる検索
<T>T entityManager#find( Class<T> class, Object primaryKey )メソッドが使用できます。

Book book = entityManager.find( Book.class, 1L );

JDK5のGenericsが非常にうまく働くケースだと思います。castの必要がありません。
指定されたprimary keyが存在しない場合は、nullが返ります。

全件検索
JPQL: "SELECT b FROM Book b"

	
	@SuppressWarnings( "unchecked" )
    public static void findAll() {
        Query query = entityManager.createQuery( "SELECT b FROM Book b" );
        List books = query.getResultList();
       	...
    }
query.getResultList()が、残念ながらGenericsに対応していません。 条件検索(位置指定パラメータ) JPQL: "SELECT b FROM Book b WHERE b.price >= ?1 AND b.price <= ?2"
    @SuppressWarnings( "unchecked" )
    public static void findWithCondition1() {
        Query query = entityManager
	    .createQuery( "SELECT b FROM Book b WHERE b.price >= ?1 AND b.price <= ?2" );
        query.setParameter( 1, 200 );
        query.setParameter( 2, 400 );
        List books = query.getResultList();
        ...
    }
条件検索(名前指定パラメータ) JPQL: "SELECT b FROM Book b WHERE b.price BETWEEN :min and :max"
    @SuppressWarnings( "unchecked" )
    public static void findWithCondition2() {
        Query query = entityManager
            .createQuery( ""SELECT b FROM Book b WHERE b.price BETWEEN :min and :max" );
        query.setParameter( "min", 200 );
        query.setParameter( "max", 400 );
        List books = query.getResultList();
        ...
    }
と言うように、Queryを指定してJPQLを実行することができます 単一結果の取得 もし、Queryが単一の結果を返すことが明らかであれば、Qeury#getSingleResult()が使用できます。 JPQ: "SELECT COUNT( b ) FROM Book b"
    public static void findWithCondition6() {
        Query query = entityManager.createQuery( "SELECT COUNT( b ) FROM Book b" );
        long count = (Long)query.getSingleResult();
    }
AnnotationによるNamedQuery JPQLの指定は、クエリを発行する側にcreateQueryで指定しました。悪くありません。 JPQLの定義を、POJO(Entity)にNamedQueryによりAnnotaion指定することもできます。以下は、2つのNamedQuery,Book.findByBookidとBook.countを定義した例です。 Book.java
import java.io.Serializable;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
...

@Entity
@Table(name = "BOOK")

@NamedQueries( {
    @NamedQuery( name="Book.findByBookid", 
                 query="SELECT b FROM Book b WHERE b.bookid = :bookid" ),
    @NamedQuery( name="Book.count", query="SELECT COUNT( b ) FROM Book b" )
} )

public class Book implements Serializable {
	...
}
@NamedQueryは、1つしか指定できず、複数定義する際は、@NamedQueriesに列挙します。 上記の名前付きクエリを利用するには、次のようにします。
    public static void findWithCondition6() {
        Query query = entityManager.createNamedQuery( "Book.count" );
        long count = (Long)query.getSingleResult();
    }
JPQLの定義のより良い場所は? JPQLは文字列であり、コンパイル時に妥当性のチェックは行なわれません。ですから、コンパイルが通った後、実行してみてエラーがでたらJPQLを修正しますが、もしJPQLがクラスに定義されていると面倒です。 JPQLを定義する場所は、「利用する側がcreateQueryに指定する」「POJOに名前つきクエリとして定義する」という方法を見てきました。これらはいずれもクラス内にJPQLが埋め込まれてしまいます。 JPQLはどこに定義できればスムーズなのだろうか? 上記のJava Persistence APIを使用した例では * 呼出側にハードコーディング * Entityにアノテート ですが、共に再コンパイルが必要です。他にできることは、 * クラスやenumの定数としてハードコード * 外部ファイルに定義 が考えられます。外部ファイルへの定義は、再コンパイルの必要が無く便利ですし、状況によっては管理し易くなるのでは無いかと思います。Hibernateではマッピングファイルに定義できます。 http://www.hibernate.org/hib_docs/v3/reference/en/html/objectstate.html#... Java Persistence APIにこれに類する方法があれば、いいのでは無いかと思います。( ad-hoc query ?) もちろん、そのような仕組みを自作することは難しくないと思いますが、それでは標準化されたAPIを使う意味が薄れてしまいます。 EJB2.xのO/Rマッピングフレームワークと組み合わせることは、あまりしたくありません。または、プロバイダースペックなのかもしれません。 (例えばHibernateを使った場合はHibernateの定義ファイルを呼び出す) もう少し、研究が必要だと思います。 まずは、単純な検索の方法を見てきました。これに複数テーブルのリレーションシップが関連してくるともっと複雑になると思われます。もう少し複雑なリレーションシップ」「モデル」に関しては別途見ていきたいと思います。

Book: JPA CRUD Update

*2006/11/4のKBlogからの転記

Persistence API, CRUDのU, Updateをストレートマッピングで行ないます。

JPAでの操作の対象であるPOJOには、いくつかの状態があります。

大別すると、Entity Managerに「管理された状態であるか」、「管理されていない状態であるか?」です。

「管理された状態」であれば、POJOに対する操作は永続化されます。
「管理されていない状態」であれば、Entity Managerはそれを永続化操作できません。

Createの際は、「管理されていない状態」からentityManager#persist()メソッドを使用して「管理された状態」になります。
Readの際は、「管理されている状態」のオブジェクトを取り出します。
Updateの際は、更新対象となるPOJOの状態が、いろいろ考えられ、状態を意識しながらの操作になります。

管理された状態のオブジェクトの更新
entityManagerの検索メソッド(find等)を経て取得してきたオブジェクトは管理された状態ですので、それにたいするオブジェクトに必要な更新を行ないトランザクションを終了させることで、永続化できます。

    public static void updateBook1() {
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();
        Book aBook = entityManager.find( Book.class, (long)1 );
        long discountPrice = Math.round( aBook.getPrice() * 0.8 );
        aBook.setPrice( discountPrice );
        entityManager.persist( aBook );
        tx.commit();
    }
管理されていないオブジェクトの更新 アプリケーション側で作成されたオブジェクト、または、entityManagerのスコープから外れたオブジェクトなどは、管理されていないオブジェクトです。 更新には常に「更新対象」がありますが、「管理されていない」とその更新対象が不明な状態です。Createに使用したpersist()メソッドは新規永続化を前提としており、「管理されていないオブジェクト」の更新はできません。更新しようとすると「キーの重複」という実行時のエラーが発生します。以下の例では、新規オブジェクトaBookは管理されていない状態のものであり、かつ、データベース上に既にPKが1であるオブジェクトが存在します。つまり、これは「管理されていないオブジェクト」の「更新」を意味します。これは、失敗します。
    public static void updateBook2() {
    Book aBook = new Book( (long)1 );
        aBook.setTitle( "Updated Book" );
        aBook.setPrice( (long)100 );
        
        EntityTransaction tx = entityManager.getTransaction();
        
        tx.begin();
        //Does not persist, Duplicate key error.
        entityManager.persist( aBook );

        tx.commit();
    }
管理されていないオブジェクトを用いて「更新」を行なう際は、merge()というメソッドを使用します。
    public static void updateBook2() {
    Book aBook = new Book( (long)1 );
        aBook.setTitle( "Updated Book" );
        aBook.setPrice( (long)100 );
        
        EntityTransaction tx = entityManager.getTransaction();
        
        tx.begin();
        entityManager.merge( aBook );
        tx.commit();
    }
merge()は、オブジェクトを「管理された状態」にしますが、PKが存在するときは「更新」として使用でき、PKが存在しないときは「新規作成」と同様の働きをします。 よって、「明示的に新しいエンティティであるオブジェクト」として扱う場合は、persistを使用し、「更新でも新規作成でもどちらでも構わない」と言うようなオブジェクトに関してはmerge()が使用できます。 JPQL: Bulk Update Query JPQLを用いてUPDATE(DELETEも)を行なうこともできます。
    public static void updateBook6() {
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();
        Query updateQuery = 
            entityManager.createQuery( "UPDATE Book b SET b.price = b.price * 1.2" );
        int updatedBookCount = updateQuery.executeUpdate();
        System.out.println( updatedBookCount + " updated" );
        tx.commit();
    }
一括更新が容易です。 永続化のタイミングに関する注意 一般的にO/Rマッピングフレームワークは、データベースの操作を自然なオブジェクト操作に置き換えたAPIを提供しますが、行なったオブジェクトの操作を適切なタイミングでいつかはRDBMSとオブジェクトの状態を同期化しなくてはなりません。つまり、SQLをRDBMSに対して発行しなくてはなりません。 オブジェクトに対する操作をRDMBSに伝搬するには、フラッシュを行ないますが、それは次のタイミングで行なわれています。 * トランザクションがcommitされるとき。 * Queryが実行される直前。 * EntityManager#flush()が呼ばれたとき。 比較的、単純な(上記のような)アプリケーションで同期のタイミングはプログラマーが把握し易いのですが、プログラムが長くなったり、複雑になってくると、同期を忘れてしまうことがあります。 忘れると、オブジェクトの状態とデータベースの状態が異なることになります。例えば、コミットを忘れると、アプリケーションではデータの更新が完了したように見えても、それがデータベースには反映されていない状態となります。これは、データベースを見てみるまでわからない場合があります。 こまめにフラッシュすれば・・・例えば、トランザクションを短くすれば、こまめに同期が行なわれ不整合の可能性を防げますが、一般的にプログラマーは、 SQLの発行を抑えようとし、フラッシュ(同期)を抑えようとします。これはパフォーマンスの向上に貢献しますが、必要なフラッシュを忘れると、アプリケーションとデータベース間で、エラーにはならない不整合が生じます。 コンパイル時にもそれは検出されませんし、実データを使用したテストを行なうまで、気がつかないときがあるので、プログラマーは同期に関して意識的にプログラムを作成する必要があります。

Book: JAP CRUD Delete

*2006/11/4のKBlogからの転記

Persistence API, CRUDのD, Deleteをストレートマッピングで行ないます。

entityManager#remove( Object object ) を使用して、管理されたオブジェクトを引数に渡すことでオブジェクトの削除が可能になります。

    public static void deleteBook1() {
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();
        Book aBook = entityManager.find( Book.class, 1L );
        entityManager.remove( aBook );
        tx.commit();
    }
JPQL: Bulk Delete Query JPQLでUPDATEと同様にDELETEも可能です。
    public static void deleteBook2() {
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();
        Query deleteQuery = 
            entityManager.createQuery( "DELETE FROM Book b WHERE b.price > 120" );
        int deletedQuery = deleteQuery.executeUpdate();
        System.out.println( deletedQuery + " rows deleted." );
        tx.commit();
    }
これまで、ストレートなマッピング(単一テーブルに対する単一のオブジェクトマッピング)の例を、Persistence UnitとしてNetbeans/GlassFishに最初から付属してくるOracle TopLinkを使用して検証してきました。 私は、TopLinkを使用したことが無かったのですが、JPAを使用することで、容易にO/Rマッピングが行なえることがわかります。

Book: Derby, JavaDB - Backup, Restore

BULK BACKUP / RESTORE

  1. データベースサーバーを停止します。
  2. 起動時に指定したderby.system.homeで指定されているディレクトリを別の場所にコピーします。
  3. データベースサーバーを起動します。
  4. リストアは、バックアップしたディレクトリをderby.system.homeに戻します。

OFFLINE BACKUP

サーバーを止めずに、Read Onlyの状態(FREEZE状態)にして、バックアップをとります。

ij> CALL SYSCS_UTIL.SYSCS_FREEZE_DATABASE();

データベースディレクトリのバックアップ(コピー)とる。

ij> CALL SYSCS_UTIL.SYSCS_UNFREEZE_DATABASE();
注)しばしば、フリーズ後、他のリクエストを受け付けなくなったり、動作がおかしい場面がありました。

ONLINE BACKUP

ij で接続し、次のプロシージャーを実行します。
ij> CALL SYSCS_UTIL.SYSCS_BACKUP_DATABASE('/backup-dir');
データベース・ディレクトリのコピーが/backup-dirに作成されます。

ONLINE RESTORE

接続時に、createFrom=/backup-dir/databaseName をパラメータとして指定します。 バックアップはインタンス単位でとられますが、リストアはデータベース単位で指定します。
ij> CONNECT 'jdbc:derby://localhost/databaseName;createFrom=/backup-dir/databaseName';
参考 http://www.ibm.com/developerworks/db2/library/techarticle/dm-0502thalama... https://developers.sun.com/docs/javadb/10.2.2/adminguide/cadminhubbkup01...

Fedora 7: Java Plugin

開発用のマシンをFedora Core 5 から、Fedora 7にアップグレードしました。

元、FC5で使用していたハードディスク(LVM)は残し、新しいハードディスクにF7をインストールしたのですが、FC5で使っていたLVMのディスクは、特別な操作を必要とすること無く、デバイスが作成されましたので、それをマウントしてそのまま使えました。

/etc/fstab

...
/dev/VolGroup00/LogVol01 /backup       ext3    defaults        0 0
...
インストール後、フォントが綺麗になっている感じがして、気持ちが良いです。(この感覚はすぐに忘れてしまうでしょうけど・・・) また、これを機会に、Playstation3で利用可能なDLNAのサーバーがあることを知り、mediatombをインストールしてみました。 PS3から、Linuxのファイルを見ることができるようになりました。これは別途、まとめたいと思います。 さて、まず、問題なく動作したのですが、Firefoxに対するJava Pluginがきちんと働かなかったので、調べてみると・・・
# yum -y install compat-libstdc++-33
が必要でした。

玉の湯

久しぶりに近所の「玉の湯」という銭湯に、子供達と行ったところ、今月(2007年9月)をもって営業を止めることになるという張り紙がしてあり、とても、残念に感じました。

昭和39年創業とのことなので、40年間、釜を炊き続けたことになります。

私は子供のころから銭湯が嫌いではなく、様々な人たちが、一日の疲れを癒しているのを見ると、何か自由な時間を感じることができます。

私が住んでいるアパートの周辺は、団地が立ち並んではいるものの、まだ、田畑が残っている田舎じみた場所です。40年前を想像すると、おそらく、何にもない中に光輝く場所として存在したのだと思います。

番台のおばさんは品が良さそうです。もし、このおばさんが40年前から番台に立っていたのならば、とても、綺麗な女性で、男性客はきっと照れたり、嬉しくなっていたことでしょう。

お金の勘定があまり得意ではないようで、「大人一人と小学生と、シャンプーと石鹸」を頼むと、たどたどしく計算機を使って時間がかかります。私は、ちょっと失礼かも知れませんが、とても、微笑ましく、おつりがくるのを待ちます。

お風呂は、清潔で、小さな露天風呂が有り、小さな庭には鯉が泳いでいて、そこからの観月は贅沢な時間です。

そして、風呂あがり、自動販売機でジュースを買い、タバコを吸いながら、またしても、月を見ながら家路に着きます。いい時間です。

玉の湯は、決して、豪華ではなく、過剰なサービスもありません。でも、私は十分満足です。

大資本の元に作られた健康ランドのように、ゲーム機が置いてあったり、マッサージができたり、バーがあったり、宴会場はありません。それでも、子供たちは、とてもいい顔をしてます。

私が生まれたころは、家やアパート、マンションに風呂がついていることは当たり前となっていましたが、銭湯は、おそらく、それ以前の時代、つまり、家風呂が当たり前では無かった時代には、無くてはならないものだったのだと思います。

もっと、想像力を働かせると、単身者用のマンション、アパート、寮などは、銭湯を中心に、あるいは、共存していたのではないかと思います。

銭湯は、オアシスのようです。

家で風呂に入れるような状態になると、銭湯は必須の施設ではなくなってきます。

もしかしたら、私が銭湯を好きな理由は、昭和的なノスタルジーを感じたいからなのかもしれません。

銭湯の未来形は、都市型スパリゾート( Zaboo のような )に発展するのかもしれませんが、先にも述べた通り、私が銭湯に望んでいるのは企業がコーディネイトする過剰なサービスではないので、あまり、関係がないように感じます。

時代とともに、愛すべきものが滅んで行くことに耐える術を身につけなくてはいけない年齢になってきているのかもしれません。

かすんだ秋の月を見ながら、玉の湯から帰ってくる途中、子供たちが、「お風呂、潰れちゃうの?」と聞いてきたので、私は、「いや、そうじゃなく、続けることを止めたんだと思う」と答えました。

Commercial or OpenSource or middle ?

先月、GlassFish v2がリリースされ、優れた技術者やコミュニティとともにSunはこれまでに無い完成度を持つApplication Serverの開発に成功したようです。

GlassFishはCDDLベースのもと、オープンソースで開発されていますが、Sunはそれを元に、Sun Java System Application Serverを製品としてリリースし有償のサポートも提供し始めています。

ソースは公開し、サービスやサポートは有償というスタイルは目新しいものではなく、JBossが見せたやり方です。
JBossの場合は、マニュアルも有償でしたが・・・

さて、前置きが長くなりましたが、Sunはたくさんのオープンソースのプロダクトに関わっている会社になりました。
時には、自社のソフトウェアをコミュニティに提供したり、プロジェクトの発起人であったり、買収した製品をオープンにしたり、元々オープンソースであったものをサポートしたり、と関わりかたはそれぞれです。

Sunのプロダクトに関連するオープンソースプロジェクト(必ずしもコードベースで対応しない物もあります)を、いくつか挙げてみました。

Product OpenSourced Comment
SPARC OpenSPARC

?
Solaris OpenSolaris

GPLv2
Java OpenJDK

GPLv2
JavaDB Derby

Apache
Sun Java System Application Server 9.0/9.1 GlassFish

CDDL
Sun Java System Directory Server OpenDS

CDDL
Sun Java System Message Queue Open Message Queue

CDDL
Sun Java System Portal Server Open Portal

CDDL
Sun Java System Access Manager Open SSO/Federation

CDDL
Sun Studio NetBeans

CDDL
StarSuite/StarOffice OpenOffice

CDDL

特に結論は無いのですが、以前あったオープンソースとコマーシャルベースのソフトウェアの二元論は、あまり意味をなさないような気がしてきます。何らかの形で共存、あるいはシフトしていくのだと思います。

BOOK: JPA one to many

テーブルとクラス(オブジェクト)が、一対一で対応している場合は非常に単純な定義ですみますが、ほとんどの場合、複数のテーブルがリレーションシップを持ちます。

以下の例は、出版社が複数の書籍を出版しているという、一対多の典型的なリレーションシップを持ったデータです。

create table PUBLISHER (
  PUBLISHERID varchar( 255 ) primary key,
  NAME        varchar( 255 ) not null
);

create table BOOK (
    BOOKID      int                 primary key,
    TITLE       varchar( 255 )      not null,
    PRICE       int,
    PUBLISHERID varchar( 255 ),
    
    constraint PUBLISHERID_KEY foreign key ( PUBLISHERID ) references PUBLISHER( PUBLISHERID )
);
RDBMSに関しては、上記でテーブルがあれば十分で、SQLを使用して実務上必要な様々なデータ操作が可能です。 例)書籍の出版社名(PUBLISHER.NAME)を検索
SELECT p.NAME, b.TITLE 
  FROM PUBLISHER p, BOOK b 
  WHERE p.PUBLISHERID = b.PUBLISHERID
     AND b.BOOKID = 1;
結果
p.NAME         b.TITLE
------------    --------------------
Publisher 1	Java Book
RDBMSの準備としては、上記で十分なのですが、これをオブジェクトとしてアプリケーションで扱う場合、概念としては以下のようにする必要があります。 これを実際に行おうとすると単純に進まないことが多くなりますが、(これに関する意見は、下にまとめます) JPAのようなO/Rマッピングフレームワークを使用すると、以下のように、オブジェクトとデータを対応させることのでき、コードはオブジェクト指向的であり理想的になります。
package jpasample;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class OneToMany1 {
  private static EntityManagerFactory factory = Persistence.createEntityManagerFactory("topLinkPersistence");
  private static EntityManager manager = factory.createEntityManager();
  
  public static void main( String[] args ) {
    
    //Bookをインスタンス化する。
    Book book = manager.find( Book.class, 1 );
    
    //Bookインスタンスから対応するPublisherインスタンスを取得する。
    Publisher publisher = book.getPublisher();
    System.out.println( publisher );
  }
}
Book側に、publisherプロパティに@ManyToOneと記述しておき、Publisher側のどのカラムで結合するのか、キーとなるカラムを@JoinColumnのname属性で指定しておきます。BOOKテーブル側のキー名(つまり外部キー名)を指定します。 「Publisherエンティティは、BOOKテーブルのPUBLISHERIDカラムを使って結合されたものです」という指定になります。ちょっと不自然な気がしますが・・・。
package jpasample;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "BOOK")

public class Book implements Serializable {
  @Id
  @Column(name = "BOOKID", nullable = false)
  private Integer bookid;
  
  @Column(name = "TITLE", nullable = false)
  private String title;
  
  @Column(name = "PRICE")
  private Integer price;
  
  @ManyToOne
  @JoinColumn( name="PUBLISHERID" )
  private Publisher publisher;

    ...以下 getter,setter ...
} 
Publisher側ではリレーションシップに関する特別なアノテーションは記述していません。
package jpasample;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "PUBLISHER")

public class Publisher implements Serializable {
  @Id
  @Column(name = "PUBLISHERID", nullable = false)
  private String publisherid;
  
  @Column(name = "NAME", nullable = false)
  private String name;

    ...以下 getter,setter ...
} 
Book側のテーブルは外部キー"PUBLISERID"としてPublisherとの関連性が記述されています。一方、Publisher側のテーブルは、Bookの存在は一切記述されていません。この場合、Bookは「リレーションシップの所有者である」と表現されます。 BookからPUBLISHERIDを通じてPublisherを得ることは可能ですが、PUBLISHERテーブルだけを眺めてもBookの存在は見えてきません。 上記の例では、Book側からPublisherを取得するという方向性を持ちました。PublisherからBookを得ることはできていません。 この状態は「単方向(unidirectional)」です。 逆に、Publisher側からそれと関連している複数のBookを取得したい場合、つまり、「双方向(bidirectinal)」とするには、相手側のエンティティのどのプロパティと対応しているのかをmappedByで指定します。
package jpasample;

import java.io.Serializable;
import java.util.Collection;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "PUBLISHER")

public class Publisher implements Serializable {
  @Id
  @Column(name = "PUBLISHERID", nullable = false)
  private String publisherid;
  
  @Column(name = "NAME", nullable = false)
  private String name;
  
  @OneToMany( mappedBy = "publisher" )
  private Collection books;

    ...以下 getter,setter ...
@OneToManyに、Book側のpublisherというプロパティによりマップされます、という指定を行います。この指定を行うことで、特定のPublisherが出版しているBookを以下のように取得できます。やはり、理想的なコードです。
package jpasample;

import java.util.Collection;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class ManyToOne1 {

  private static EntityManagerFactory factory = Persistence.createEntityManagerFactory("topLinkPersistence");
  private static EntityManager manager = factory.createEntityManager();

  public static void main(String[] args) {
    Publisher publisher = manager.find( Publisher.class, "PUB-1" );
    Collection books = publisher.getBooks();
    for( Book book : books ) {
      System.out.println( book );
    }
  }
}
実際に発行されているコードを見てみると、
SELECT PUBLISHERID, NAME FROM PUBLISHER WHERE (PUBLISHERID = ?)
SELECT BOOKID, TITLE, PRICE, PUBLISHERID FROM BOOK WHERE (PUBLISHERID = ?)
の2つが実行されています。 まとめとして、リレーションシップを指定する際は・・・
  • リレーションシップの所有側はどちらか? を把握しておく。(外部キーが定義されているテーブル側)
  • 所有者側のプロパティに@ManyToOneと@JoinColumn( name="外部キー" )を指定する。
  • 双方向でオブジェクトを扱いたければ、非所有者側にコレクションプロパティを追加し@OneToMany( mappedBy="相手側のプロパティ" )を指定する。
以上で、2つのエンティティの結びつけが可能になります。

リレーショナルとオブジェクトのマッピングについて

一対多の関係をO/Rマッピングで操作しようとすると、単に一つのテーブルをオブジェクトで扱う時と比べて、徐々に複雑さが増してきますが、リレーショナルデータベースを扱う際は避けて通れない状況です。その困難さと複雑さは、「オブジェクトとリレーショナルのインピーダンスミスマッチ」と表現され、一般的な問題として取り上げられていますし、それを解決するためのO/Rマッピングフレームワークであるといわれます。 そして、「O/Rマッピングフレームワークの導入がすべて解決するというものではない」ということもいわれています。ある書籍に、「O/Rマッピングはベトナム戦争のようなもので、最初は誇らしげに参入するが、結果は惨憺たるものだ」と記されており、経験上、ある程度同意できます。シンプルなJDBCとSQLを使ってデータ操作した方が、格段に楽な場合が少なくありません。 すぐそこに見えるデータを更新したいのに、面倒なフレームワークの手続きが必要となるのは、ストレスな場合があります。エンティティをオブジェクトして扱えると便利な場合と、表形式のデータ操作の方が楽な場合の2種類が存在すると考えます。 オブジェクト指向を好んでいる人は、全てをオブジェクトで操作したいでしょうし、逆に、SQLだけのシンプルな手法ですべて対応できれば、それはそれで悪くありません。 いずれにしても、リレーショナルに設計されたデータを、オブジェクトとして扱う場合、O/Rマッピングを導入したとしても、何らかの努力が必要になります。つまり、「リレーショナルなデータをオブジェクトで扱う」と言うのは、一つのアイディアではあるのですが、現実問題として、JavaもRDBMSもそれぞれお互いのモデルを完全にサポートしているわけでもありませんし、お互いの実装の相互運用を考慮して作られた概念では無いので、その概念の違いは、自前で埋める必要があると思っています。その一つの有力な候補である、JPAは、Java側で、リレーショナルな概念をサポートする新しい標準として、非常に興味深いものです。 私は、面倒くさがりで、記憶力が弱く、必要以上の知識を頭に入れておくことの出来ない人間です。 脳のスペースが狭いので、可能な限り単純な方法で、様々な局面に対応できるものだけを頭に入れておかなくてはなりません。 JPAについて、身につける必要があるかととわれれば、YESです。おそらく、学習に要する努力以上の効果が期待できるからです。

SunがDrupalコミュニティーにX4200を寄付。良い感じです。


私も使っているCMS, Drupalですが、そのサイトで「Sun MicrosystemsがDrupalのサイトのインフラとしてX4200 (AMD Opteronマシン) を寄付した」と報じられています。
http://drupal.org/node/200275

Drupal.orgは、月に6百万から16百万くらいのアクセスがあるがあるそうで、遅さを感じる時がありました。(当然ですが、不満はありません)Apache + PHP + MySQLで動作していて、昔からパフォーマンスを向上させるためMySQLやPHPのパフォーマンスチューニングなどの、改善はなされてきたようですが、寄付で運営されいるサイトで細々とやっているような感じはしていました。

X4200はシンプルなラックマウントタイプのOpteronマシンで、何台寄付されたとか、CPUはシングルなのかマルチなのかとか、メモリはどれくらいとか、細かいことは発表では見つけられなかったのですが、企業が、あまりでしゃばらず、静かにコミュニティを支援し、それを、コミュニティがみんなに報告する、という関係は良いことだと感じます。Sun側があまり宣伝を考えずに気軽に寄付したような感じを受けますし、それを、Drupalのコミュニティがきちんと報告しているのは礼儀正しい感じをうけます。

オープンかコマーシャルか? 別の投稿でも書いたのですが、「コマーシャルかオープンか?」という二元論にはあまり意味がなく、ひとつの態度として、どのように共存するかといった距離感を考えることが課題なのだと思います。

また、経験的に、単に早いマシンをコミュニティに送りつけただけでは、通常、役に立ちません。現在、運用されているネットワーク上で正しく稼動させるための移行作業であるとか、経験的な運用能力が必要になるでしょう。さらに、これまでの構成や運用方法、あるは文化などを尊重しつつ新しいマシンをネットワークシステム上に追加するのは、案外、人間的な相互理解を必要とするものです。
そこが、一番困難であり、また、重要なところです。

単に、「無料でマシンをお貸しします!」の営業キャンペーンだけでは、そういった重要な部分を欠くことになります。

また、以前、ある会社で上記のような「新機種無料貸し出しキャンペーン」「開発者支援」「スタートアップキャンペーン」に申し込んだら、「御社は与信審査に通らなかったので御貸しできません」という返答が返ってきたことがあり、失望したことがあります。

弊社の名誉のために言っておくと、これまで、その会社とは多くの取引を行っており、支払いが滞ったことなど一度もありません。逆に、その会社からの支払いを「小切手でもいいですか?」といわれたことがあり、それはお断りしたことがあります。

結局、上記の「無料貸し出し」や「開発者支援」というのは、何か新しいことを始めようとする人や、これからの可能性にテクノロジーを必要としている人たちに対して向けられたものではなく、自社の企業イメージのアップだけにやっている独善的なものが多いと感じました。(もちろん、すべてのリセラーが同じ基準ではないと思いますが) 後日、担当の営業の方が、そのキャンペーン枠とは別の方法で尽力してくれて、私たちはマシンを評価できました。

今の日本が持っている閉塞感はこれからしばらく続いていくことでしょうが、それは「人間が変われば打ち破れる可能性のある感覚」だと思うのです。US SunのDrupal.orgへのアプローチの仕方はとてもいい感じのコラボレーションだと感じます。

JavaのNon HeapとLoaded Classesの相関関係

少々大型のJavaのWebアプリケーション(Portal Server)を動かしつつ、JConsoleでApplication Serverの統計情報をモニタリングしていたところ、面白い発見をしました。

非ヒープメモリーの使用量と、ロードされたクラスがほぼ対応します。

こちらは非ヒープの遷移状態(4時間程度): non heap memory usage

こちらはロードされたクラスの数の遷移状態(4時間程度): loaded classes

非ヒープのメモリ構成は、

  • Code Cache
  • Perm Gen[shared-rw]
  • Perm Gen[shared-ro]
  • Perm Gen

となっています。

クラスには、大きいもの、小さいものもあるでしょうから、一概に数とメモリが一致するわけでないのでしょうが、上のようなグラフを見ると、クラスのロードがメモリに与えるインパクトが感覚的に良くわかりました。

Identity Manager, Reconciliation small Test.

Sun Java System Identity Managerで、調整(Reconciliation)の簡単なパフォーマンステストをおこないました。

Simulated Resourceに、次のようなユーザーを1万件用意し、完全調整によりIDMユーザーの新規作成をすると言った簡単なものです。

<!--以下のデータを10,000件用意-->
<Object name='cn=account_9999,dc=example,dc=com'>
  <Attribute name='employeeId' value='E9999'/>
  <Attribute name='firstname' value='fname_9999'/>
  <Attribute name='lastname' value='lastname_9999'/>
  <Attribute name='login' value='account_9999'/>
  <Attribute name='password'>
    <EncryptedData>wLYoaIy6NDTCUv7D1AsY5A==</EncryptedData>
  </Attribute>
</Object>
使用した環境
  • AMD Opteron 148 ( 2.2GHz Single Core )
  • RAM 2G
  • Solaris 10 x86
  • Sun Java System Identity Manager 7.0
  • Web Container: Tomcat 5.5
  • Repository DB: MySQL 5.0
  • Direct JDBC Connection to Repository (Not App Server JNDI pooled Connection )
上記いずれも、デフォルトの状態です。 結果として、72分間で完了しました。よって、概算で・・・ 8334.0 / 時 138.8 / 分 2.3 / 秒 という状態です。エラーが1件あります。 メモリの使用率は実行時とほぼ変わらず、CPUの負荷は常時100%近い状態で、ほとんどがリポジトリ・データベースが占有していてアプリケーションサーバー(Tomcat)の負荷は高くありませんでした。 上記の計算で行くと、例えば5万件のシーディングでは約6時間必要と言うことになりそうです。 継続: この処理の遅さは、Identity Managerというよりは、RDBMSの負荷によるものだと推測します。 この負荷を、外にだし、つまり、RDBMSを別コンピューターで稼動させれば、パフォーマンスが向上する気がします。 まずは、基本となる数字が出たので、後日、トライします。 ・・・後日・・・ 上記と同じ検証用マシンを2台用意し、片一方にTomcat + Identity Manager、もう片一方にMySQLを稼働させGiga Bit Etherで接続し同じ検証をしてみました。 結果は期待したほど状況が変わらず、62分間で完了しました。概算で… 9677.4 / 時 162.1 / 分 2.6 / 秒 となりました。エラーが4件あります。 やはり、結局はMySQL側がボトルネックになっているように見えます。 ・・・この後、MySQLのチューニングを行いました。・・・続く・・・

Identity Manager, Reconciliation small Test #2.

前回のテストで、Web ContainerとMySQLを別のマシンに移しても、MySQL側のCPU負荷の高さがボトルネックになり調整機能のパフォーマンスは上がらなかったので、同じ状況で、MySQLのパフォーマンスチューニングを行いました。

MySQLのsupport-filesディレクトリには、my.cnfファイルのテンプレートが何パターンか含まれており、その中の、 my-innodb-heavy-4G.cnf を使用して、再度同じテストを行いました。

このファイルの中の、innodb_buffer_pool_size = 2G(デフォルト8M) とquery_cache_size = 64Mという設定は効果が期待できるパラメータです。

デフォルトのinnodb_buffer_pool_size

mysql> show variables like 'innodb_buffer_pool_size';
+-------------------------+---------+
| Variable_name           | Value   |
+-------------------------+---------+
| innodb_buffer_pool_size | 8388608 | 
+-------------------------+---------+
my-innodb-heavy-4G.cnfを/etc/my.cnfとしてコピー後、MySQLをサーバーを再起動。
mysql> show variables like 'innodb_buffer_pool_size';
+-------------------------+------------+
| Variable_name           | Value      |
+-------------------------+------------+
| innodb_buffer_pool_size | 2147483648 | 
+-------------------------+------------+
この状態で、前回のテスト同様、10,000件のユーザーを作成する調整を実行したところ、すごい効果が得られました。 調整による10,000件の新規ユーザー作成に要した時間
- トータルタイム user/hour user/min user/sec
チューニングなし 61分 58秒 9677.4 162.1 2.6
my-innodb-heavy-4G.cnf 16分 22秒 36648.0 (予測値) 610.8 10.1
約4倍近い性能が得られます。 このとき、mysqldのプロセスサイズは約2.6GBとなり、RSSは最大682Mまで上がりました。
   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP       
  2479 root     2608M  682M sleep   59    0   0:13:38 0.3% mysqld/20
...
マシンのメモリサイズを検討しつつ、MySQLのInnoDBで使用するメモリサイズを上げると、かなりの効果が上がると思われます。 懸案事項・・・・ Identity Manager 7.0で、調整を実行すると、しばしば「エラーありで完了」となり、10,000件のうち、0件から7件程度の新規ユーザーの作成に失敗します。7.1でテストしたときは出なかったのですが、たまたまかもしれません。いずれにしてもReconcilerとRDBMS、JDBCとの関係で発生するのだと思います。継続的な検証を続けたいと思います。

Firefox 3 beta 2 release!

Firefox 3 beta 2がリリースされています。

いろいろ新機能があるようで、とてもよい感じです。

動かしていると、いろいろ新機能があるようで、「ズーム機能」がフォントだけでなく完全なズームイン/ズームアウトが使えたり、URL履歴が賢くなっていたり、また、パフォーマンスもあがっているとのこと。

押し売りの機能追加ではなく、シンプルで使い勝手の良い、センスの良い、「正しい道」を歩んでいると感じます。

開発者の方々、がんばってください!

--

GlassFish v2UR1 and Sun Java System Application Server 9.1 Update 1.


GlassFish v2UR1およびSun Java System Application Server 9.1 Update 1がリリースされています。これは、v2のUpdate Release 1であり、GlassFish v2.1 とは別の開発ブランチです。

v2のリリースが今年の9月で、3ヶ月たったわけですが、速報をみると、150程度のバグの修正と拡張がなされているとことです。

150の修正、拡張という数をどう見るかは、人によると思いますが、私はいつもこういったことを「開発者の恥」だとは感じません。状況にもよると思いますが、そういった不具合を「仕様なので我慢してください」と正当化したり、ブラックボックス化して隠して見せないやり方より、よっぽどよいと思っています。

なぜ、不具合が生じたとき言い逃れをしなければならない状態が発生するかというと、自分には力がないのに「これは完全です」と、選挙公約のように宣言してしまうからでしょう。以前ニュースで、役所のコンピューターシステムの安全性を説明するときに、ある人が「このネットワークシステムのセキュリティは絶対安全です。」といっていたのを聞いて、その考えや態度自体が危険だと本能的に感じました。立場的にそう言わなければ、相手が納得してくれないと考えたのであれば、それこそ相手に対する欺瞞になり得ます。

ですから、そういったことに対する疑問は、「その人は、なぜそういうことを言ってしまうのか?」という点に帰着するのですが・・・無知なのか、または、嘘をつくと何か利益があるのか、どちらかしかないと感じます。どちらにしても、絶対の安全を予知することは占い師と同程度の発言になってしまいます。

私の知る限り、ソフトウェアとコンピューターとそのネットワークシステムというのは、すでにひとりの人間の手に負えるものではなくなっています。ですから、ある人が絶対を宣言するとか保証することは不可能です。できることは、可能な限りの努力しかありません。そして、その結果は、予測が困難です。

不完全さや不具合を肯定するつもりはありませんが、減点法だけでものを評価してはいけないと思います。高度なもの、複雑なもの、新しいものには、常に不具合がつきまといます。問題は、その不具合をどう克服していくかであって、最初から完全さを要求するのであれば、そういった新しいものとはつきあわない方が良いでしょう。

ある限定された中での完全さはあり得ると思いますが・・・。

市場経済と競争社会はほぼ同義です。他社の製品より優位であるという営業活動がなければ、競争に不利であり、競争に勝てなければ活動の継続が困難です。競争社会の利点は、良いものが残り、悪いものが淘汰されることにあるのですが、現実の世界は、本当にそうなっているでしょうか? 市場で優位であるためには、自社の製品が他社より良いものであると宣伝するのが効果的です。それが行き過ぎて、実体と乖離したとしても、それは消費者や利用者が適切に判断すればよい訳ですが、2つの点で良くないことがおきます。

1) 仮に、同一の品質を提供する2つの企業があったときに、「自社の方が勝っている」と嘘、あるいはそういったニュアンスを含むことを宣伝している企業が勝つ可能性がある。嘘が営業活動の本質であるとは思わないが、たとえば、嘘を言わない範囲であたかも自社が勝っているような表現は可能ではないか? いずれにしても、宣伝した方が勝つ確率が高い。しかし、宣伝にかけた費用を消費者は支払う、あるいは企業が利益を削ることになるので、広告費をかけない商品の方が安価になる可能性が高く、消費者にとっては有益なはずだ。しかし、宣伝を行わない企業は、消費者がそのことに気づく前に宣伝費をかけた企業に負けてしまい、市場から消えてしまう。市場から消えてしまいたくないので、両者、宣伝費をかけ、メディアに対する出資額が多くなる。結果として、みたくもないCMを見せられたあげく、どの製品も割高になり、競争の果てに、あまり意味のない費用を支払わなくてはならなくなるか、または、社員の給与や報酬を少なくしつつ、あるいは場合によっては立場の弱い社員を解雇しつつやっていかざるを得なくなる。

2) もし、「自社の方が勝っている」という嘘を言うことを会社から営業という名目で職業にしている場合、本当はそうではないのに、そういわなければならない立場に立たされると、その人は、ある種の責任が生じてしまい、精神的に辛くなる。精神的に追いつめられると、目つきが鋭くなったり、他人に八つ当たりをしたり、お年寄りに席を譲らなくなったり、自殺したり、とにかく幸せを感じられなくなり、周りの人を不幸にする。唯一の慰めは、給与が上がることだが、敵も同じくらいがんばっているので、なかなか結果に結びつかず、さらにいらいらするかもしれない。

ということで、いわゆる、一般的な市場からちょっと距離を置いているものの方が、もしかしたら長いライフサイクルで発展していく可能性が高いように思います。もちろん、携わっている人がちが高い志を持っているかどうかが、最も重要だと思います。

新しいものを求めない生き方・・・それを良しとするするように自分がなっていたとしたら・・・それは、とても怖いことだと思います。

Book: ポータルに関して

「ポータル・サービス」は、分散したシステムの入り口となる情報や機能を提供するもので、たくさんのコンピューターシステムに簡単にアクセスできるようなインターフェイスを提供するシステムです。

ポータルに技術的定義を与えるのは困難で、非常に大雑把に言うとユーザーが利用しやすいような複数システムの情報を集約したトップページの提供が目的となります。

これから、主に、このポータルを構築するための技術に関して考えていこうと思います。

「ポータル(サイト)」という言葉について・・・

インターネット上で、ポータルについて検索すると実にさまざま種類のポータルが存在し、ポータルという言葉を単に技術的な観点から定義するのは困難です。

Wikipedia:
元々ポータルとは、港(port)から派生した言葉で、門や入口を表し、特に豪華な堂々とした門に使われた言葉である。このことから、ウェブにアクセスするために、様々なコンテンツを有する、巨大なサイトをポータルサイトというようになった。入口、玄関という意味でエントランス(entrance)を使わなかったのは、ポータルには「豪華、堂々とした」という意味合いが強かったためと思われる。

e-words.jp:
インターネットの入り口となる巨大なWebサイト。検索エンジンやリンク集を核として、ニュースや株価などの情報提供サービス、ブラウザから利用できるWebメールサービス、電子掲示板、チャットなど、ユーザがインターネットで必要とする機能をすべて無料で提供して利用者数を増やし、広告や電子商取引仲介サービスなどで収入を得るサイトのことをいう。

ウェブを検索する限り、ポータルという言葉は「ユーザーにとっての入り口になるサイト」として使われます。どのようなサイトがその人にとって「入り口」となるかは、完全に個々人よって異なり、定義は不可能です。例えば、ジャズが好きな人にとってのポータルと、クラシックが好きな人のポータルは異なるでしょう。

私の知る限り、現時点で洗練されたインターネット上のオープン・ポータル・システムの好例は、iGoogleです。

ここでは、技術的なポータル要件を考えます。

ポータル・サービスが含む機能目標には一般に次のものがあります。

  • 複数システム上の情報の要約情報を集約できる。
  • 要約される表示される情報は、利用者個人によってパーソナライズとカスタマイズできる。
  • 検索エンジン。
  • エンタープライズポータルの場合、社内のリソースにアクセスできるようなセキュリティを提供する。

ポータル・システム

上記の機能を迅速に構築できるようにするために、多くの企業やコミュニティがポータルシステム、あるいはフレームワークを提供してます。

製品によって実装や構成はさまざまであり、一言でその特徴を述べることは困難ですが、まず、ほとんどの製品がユーザー管理、認証、認可、シングルサインオン、パーソナライズのためのリポジトリ、システムと統合するためのチャネル(Google的にはガジェット)、コンテンツ記述のためのAPI、管理インターフェイスの提供を行っています。

多くのシステムと通信、連携し、それらを束ね、かつひとつのシステムのように動作させるためのユーザー管理(シングルサインオン)を行うため、システムは非常に複雑な構成となっています。

Book: Access Manager7.1のインストール #1

Sun Java System Access Managerは、Application Server, Web Container上で動作するシングルサインオンのためのシステムです。

Sun Java System Access Managerをインストールするためには、次のコンポーネントが必要です。

  • Sun Java System Directory Server
  • Web Container ( Sun Java System Application Server, Sun Java System Web Server, etc...)

今回は、Linux環境にNon GUI環境で、Access Managerをインストールします。インストールのバリエーションやパッケージはたくさんありますが、今回は次の手順でインストールします。

  1. JDK1.6 [インストール方法 >>]
  2. Sun Java System Application Server 9.1 update 1 (単体のパッケージ) [ インストール方法 >> ]
  3. Sun Java System Directory Server 6.2 (SJES5u1のパッケージを使用)
  4. Sun Java System Access Manager 7.1 (SJES5u1のパッケージを使用)

Sun Java System Directory Server 6.2のインストール

GUIで行えば、同等のことができますが、ここではNonGUIで、かつ「あとで設定(インストーラでの初期設定を使用せず)」でインストールします。
SJES5u1のパッケージは、Sunのサイトから入手できます。http://www.sun.com/download/index.jsp

# ./installer -nodisplay
業務ソフトウェアを単純化する Sun Java(TM) Enterprise System へようこそ。
...
上のソフトウェアライセンスの条項をすべてお読みになった上でライセンスに同意しますか [No] {"<" 戻る, "!" 終了}? yes

インストールのタイプ
-----------------
Sun Java(TM) Enterprise System の製品とサービスの一式をインストールしますか ? (Yes/No) [Yes] {"<" 戻る, "!" 終了} no

ソフトウェアコンポーネントの選択 - メインメニュー
-------------------------------
注: "* *" は、選択が無効であることを示します。

[ ] 1. Directory Preparation Tool 6.4
[ ] 2. Web Server 7.0 Update 1
[ ] 3. Web Proxy Server 4.0.5
[ ] 4. Directory Server Enterprise Edition 6.2
[ ] 5. Access Manager 7.1
[ ] 6. High Availability Session Store 4.4.3
[ ] 7. Message Queue 3.7 UR2
[ ] 8. Application Server Enterprise Edition 8.2 Patch 2
[ ] 9. Service Registry 3.1 Update 1
[ ] 10. Portal Server Secure Remote Access 7.1 Update 2
[ ] 11. Monitoring Console 1.0 Update 1
[ ] 12. Portal Server 7.1 Update 2
[ ] 13. Java DB 10.2.2.1
[ ] 14. すべての共有コンポーネント

インストールする製品のリストをコンマで区切って入力するか、または R を入力してリストを更新します [] {"<" 戻る, "!" 終了}: 4,5,14

ソフトウェアコンポーネントの選択 - 選択内容の確認
--------------------------------------------

選択した製品の依存に基づいて、インストーラが以下をインストールします:

* * Directory Preparation Tool 6.4
[X] 4. Directory Server Enterprise Edition 6.2
[X] 5. Access Manager 7.1
[X] 14. すべての共有コンポーネント

続行するには Enter キーを押します。複数の製品を選択解除するには、製品のリストをコンマで区切って指定します。製品の選択解除するには、「-」の直後に製品番号を入力します。たとえば、-5 と入力すると、5 番目の製品が選択解除されます。コンポーネント選択リストに戻るには r キーを押します。 [1] {"<" 戻る, "!" 終了} 1

コンポーネントの選択 - 選択された製品 "Directory Preparation Tool 6.4"
-----------------------------------------------------

コンポーネントの選択 - 選択された製品 "Directory Server Enterprise Edition 6.2 "
---------------------------------------------------------------

*[X] 1. Directory Server 6 Core Server
*[X] 2. Directory Service Control Center
*[X] 3. Directory Server コマンド行ユーティリティー
*[X] 4. Directory Proxy Server 6.2 Core Server

インストールするコンポーネントをカンマで区切ったリストを入力します (すべてのコンポーネントをインストールする場合は A を入力) [A] {"<" 戻る, "!" 終了} A

続行するには Enter キーを押します。複数の製品を選択解除するには、製品のリストをコンマで区切って指定します。製品の選択解除するには、「-」の直後に製品番号を入力します。たとえば、-5 と入力すると、5 番目の製品が選択解除されます。コンポーネント選択リストに戻るには r キーを押します。 [1]{"<" 戻る, "!" 終了} 1

コンポーネントの選択 - 選択された製品 "Access Manager 7.1 "
------------------------------------------

*[X] 1. Access Manager コアサービス
*[X] 2. Access Manager 管理コンソール
*[X] 3. 連携管理の共有ドメインサービス
*[X] 4. Access Manager SDK
*[ ] 5. Access Manager 分散認証ユーザーインタフェース
*[ ] 6. Access Manager クライアント SDK
*[ ] 7. Access Manager セッションフェイルオーバークライアント

インストールするコンポーネントをカンマで区切ったリストを入力します (すべてのコンポーネントをインストールする場合は A を入力) [A] {"<" 戻る, "!" 終了} A

*[X] 1. Access Manager コアサービス
*[X] 2. Access Manager 管理コンソール
*[X] 3. 連携管理の共有ドメインサービス
*[X] 4. Access Manager SDK
*[X] 5. Access Manager 分散認証ユーザーインタフェース
*[X] 6. Access Manager クライアント SDK
*[X] 7. Access Manager セッションフェイルオーバークライアント

続行するには Enter キーを押します。複数の製品を選択解除するには、製品のリストをコンマで区切って指定します。製品の選択解除するには、「-」の直後に製品番号を入力します。たとえば、-5 と入力すると、5 番目の製品が選択解除されます。コンポーネント選択リストに戻るには r キーを押します。 [1]{"<" 戻る, "!" 終了} 1
...

選択したすべてのコンポーネントに多言語パッケージをインストール [Yes] {"<" 戻る, "!" 終了}: yes
コンポーネント製品の場合 [ Access Manager 7.1 ]
--------------------------------------------------------------

1. Web Server 7.0 Update 1
2. Application Server Enterprise Edition 8.2 Patch 2
3. 互換性のある Web コンテナが、このシステム上にすでにインストール済み

選択した製品に対する Web コンテナを選択してください [1] {"<" 戻る, "!" 終了} 3

アップグレードの必要がある共有コンポーネント
-----------------------------------

現在、以下の共有コンポーネントがインストールされています。これらは、インストール対象として選択された製品との互換性を維持するためにアップグレードされます。

コンポーネントパッケージ
--------------------
MFWK sun-servicetag
2.0.108 (インストール済み)
2.0.108 (必須)

共有コンポーネントをアップグレードするには 1 を、取り消すには 2 を入力します [1] {"<" 戻る, "!" 終了}: 1

インストールディレクトリ
------------------------

製品ごとにインストール先のディレクトリの名前を入力してください:

Directory Preparation Tool [/opt/sun/comms/dssetup] {"<" 戻る, "!" 終了}:
Directory Server [/opt/sun] {"<" 戻る, "!" 終了}: /opt/sun
Access Manager [/opt/sun] {"<" 戻る, "!" 終了}: /opt/sun

システム状態の確認中
使用可能なディスクスペース... : 確認中 .... OK
インストールされているメモリー... : 確認中 .... OK
インストールされているスワップ空間... : 確認中 .... OK
オペレーティングシステムのパッチ... : 確認中 .... OK
オペレーティングシステムリソース ... : 確認中 .... OK
システムではインストールの準備が完了しています

継続するには 1 を押してください [1] {"<" 戻る, "!" 終了} 1

設定タイプの選択画面

1. 今すぐ設定 - 選択した項目でデフォルトを上書き (エクスプレス設定)
2. あとで設定 - インストール後に手動で設定

設定の種類を選択 [1] {"<" 戻る, "!" 終了} 2

インストール準備完了
----------------
次のコンポーネントがインストールされます。

製品: Java Enterprise System 5
アンインストーラの場所: /var/sadm/prod/sun-entsys5u1
必要な容量: 216.78 MB
-----------------------------------------
Sun Java(TM) System Directory Preparation Tool
Sun Java(TM) System Directory Server Enterprise Edition 6.2
Sun Java(TM) System Directory Server Enterprise Edition 6.2 コマンド行ユーティリティー
Java Enterprise System Directory Server 6.2 Core Server
Java Enterprise System Directory Service Control Center
Java Enterprise System Directory Proxy Server 6.2 Core Server
Sun Java(TM) System Access Manager 7.1
ClientSDK
DistributedAuthentication
Access Manager SDK
連携管理の共有ドメインサービス
Access Manager 管理コンソール
SessionFailOverClient
Access Manager コアサービス
すべての共有コンポーネント

1. インストール
2. やり直し
3. インストール終了

何を実行しますか [1] {"<" 戻る, "!" 終了}? 1

Java Enterprise System 5
|-1%--------------25%-----------------50%-----------------75%--------------100%|
インストールが完了しました
ソフトウェアのインストールが正常に完了しました。 次の選択肢からインストー
ルのサマリーとログを表示できます。 サマリーファイルとログファイルは/var/opt/sun/install/logs/ に配置されています。

次に実行する手順は、『Sun Java(TM) Enterprise System インストールガイド』の「インストール後の設定と起動」の章で説明している、インストール後の設定と検証です。詳細については http://docs.sun.com/doc/820-2827 を参照してください。

インストールサマリーを表示するには 1 を、インストールログを表示するには 2 を入力してください [1] {"!" 終了} !

/opt/sun以下に、dps6, ds6, dscc6, dsee6のDirectory Server関連のディレクトリが、また、identity, mobileaccessにAccess Manager関連のディレクトリが作成されます。

Book: Access Manager7.1のインストール #2

前の手順でインストールしたDirectory ServerのディレクトリまでのPATHを設定し、コマンドが実行できることを確認します。

:::: .profile :::::
PATH=/opt/sun/ds6/bin:/opt/sun/dsee6/bin:....
export PATH

... 読み込み ...
# . .profile

... 確認 ....
# which ldapmodify
/opt/sun/dsee6/bin/ldapmodify
# which dsadm
/opt/sun/ds6/bin/dsadm
# which dsconf
/opt/sun/ds6/bin/dsconf

Access Manager用に、Directory ServerのインスタンスとSUFFIXを作成します。

# dsadm create /var/ds1
Directory Manager パスワード を選択:
Directory Manager パスワード を確認:
インスタンスを起動するには「dsadm start '/var/ds1'」を使用します

# dsadm start /var/ds1
サーバーが起動しました: pid=5599

# ps -ef | grep slapd
root 5599 1 1 01:31 ? 00:00:00 /opt/sun/ds6/lib/ns-slapd -D /var/ds1 -i /var/ds1/logs/pid

# dsconf create-suffix o=root
サーバーから提示された証明書「CN=shilver.dev.knowd.co.jp, CN=636, CN=Directory Server, O=Sun Microsystems」は信頼できません。
受け入れは「Y」、1 回だけ受け入れは「y」、拒否は「n」、詳細を表示は「d」を入力: y
「cn=Directory Manager」のパスワードを入力:

# ldapsearch -b "" -s base objectclass=* namingcontexts
version: 1
dn:
namingcontexts: o=root

...または...
# dsconf list-suffixes
サーバーから提示された証明書「CN=shilver.dev.knowd.co.jp, CN=636, CN=Directory Server, O=Sun Microsystems」は信頼できません。
受け入れは「Y」、1 回だけ受け入れは「y」、拒否は「n」、詳細を表示は「d」を入力: y
「cn=Directory Manager」のパスワードを入力:
o=root

Book: Access Manager7.1のインストール #3

Access ManagerをWeb Container( Sun Java System Application Server 9.1 Update 1 )に配備します。

SJES5u1には、Application Server 8.2がバンドルされていてこれが標準のウェブコンテナだったのですが、9.1もテクニカルノートにてサポートされていますので、このドキュメントを参照しつつ作業するとよいでしょう。
http://docs.sun.com/app/docs/doc/820-3043/6nejrv3m2?a=view

今回は、SJESu1のインストーラーを使用し、「あとで設定」を選びましたので、amconfigを使ってインスタンスの設定を行います。これに関しては、Application Server 8.2でも9.1でもおなじ方法をとるようです。

/opt/sun/identity/bin/amconfig という設定のためのスクリプトに、適切に設定したパラメーターファイルを指定します。パラメーターファイルのテンプレートは/opt/sun/identity/bin/amsamplesilentにあります。

これを、今後のために適当なディレクトリにコピーし、必要な部分を変更、編集します。
パラメータの詳細:http://docs.sun.com/app/docs/doc/819-5899/6n7uuth7b?a=view

# cp /opt/sun/identity/bin/amsamplesilent /work-dir/myconfig

:::: 編集されたmyconfig ::::
DEPLOY_LEVEL=1
SERVER_PROTOCOL=http

SERVER_NAME=shilver
SERVER_HOST=$SERVER_NAME.dev.knowd.co.jp
SERVER_PORT=8080
ADMIN_PORT=4848
DS_HOST=$SERVER_HOST
DS_DIRMGRPASSWD=password
ROOT_SUFFIX="o=root"
SM_CONFIG_BASEDN=$ROOT_SUFFIX
ADMINPASSWD=password
AMLDAPUSERPASSWD=passwordam
DEBUG_LEVEL=error
DEBUG_DIR=/var/opt/SUNWam/debug
COOKIE_DOMAIN=.dev.knowd.co.jp
AM_ENC_PWD=""
NEW_OWNER=root
NEW_GROUP=root
PAM_SERVICE_NAME=root
WEB_CONTAINER=AS8

#DISTAUTH_PROTOCOL=http
#DISTAUTH_HOST=distAuth_sample.com
#DISTAUTH_PORT=80

APPLICATION_USER=anonymous
APPLICATION_PASSWD=anonymous

SSL_PASSWORD="sample"

BASEDIR=PLATFORM_DEFAULT

CONSOLE_HOST=$SERVER_HOST
CONSOLE_PORT=$SERVER_PORT
CONSOLE_PROTOCOL=$SERVER_PROTOCOL

CONSOLE_REMOTE=false

SERVER_DEPLOY_URI=/amserver
CONSOLE_DEPLOY_URI=/amconsole
PASSWORD_DEPLOY_URI=/ampassword
COMMON_DEPLOY_URI=/amcommon
DISTAUTH_DEPLOY_URI=/amdistauth
CLIENT_DEPLOY_URI=/amclient

DIRECTORY_MODE=1
DS_PORT=389
DS_DIRMGRDN="cn=Directory Manager"
USER_NAMING_ATTR=uid
ORG_NAMING_ATTR=o
ORG_OBJECT_CLASS=sunismanagedorganization
USER_OBJECT_CLASS=inetorgperson
DEFAULT_ORGANIZATION=

CONFIG_AD="false"
CONFIG_SERVER=$DS_HOST
CONFIG_PORT=$DS_PORT
CONFIG_ADMINDN="cn=dsameuser,ou=DSAME Users"
CONFIG_ADMINPASSWD="$ADMINPASSWD"

JAVA_HOME=/usr/java/latest

AM_REALM=enabled

PLATFORM_LOCALE=en_US

XML_ENCODING=ISO-8859-1

NEW_INSTANCE=false

############### Required for Application Server 8.x ########################

AS81_HOME=/opt/SUNWappserver-amcontainer
AS81_PROTOCOL=$SERVER_PROTOCOL
AS81_HOST=$SERVER_HOST
AS81_PORT=$SERVER_PORT
#AS81_PROTOCOL=$DISTAUTH_PROTOCOL
#AS81_HOST=$DISTAUTH_HOST
#AS81_PORT=$DISTAUTH_PORT
AS81_ADMINPORT=$ADMIN_PORT
AS81_ADMIN=admin
AS81_ADMINPASSWD="$ADMINPASSWD"
AS81_INSTANCE=server
AS81_DOMAIN=domain1
AS81_INSTANCE_DIR=/opt/SUNWappserver-amcontainer/domains/${AS81_DOMAIN:-domain1}
AS81_DOCS_DIR=/opt/SUNWappserver-amcontainer/domains/${AS81_DOMAIN:-domain1}/docroot
AS81_ADMIN_IS_SECURE=false

amconfigスクリプトを実行します。
スクリプトを流す前に、次の点を確認しておきます。

  • Application Server(DAS)が起動していること。
  • Directory Serverが起動していること。
  • Directory Serverにパラメーターファイルで指定されているROOT_SUFFIXが存在すること。
# asadmin start-domain

# cd /opt/sun/identity/bin

# ./amconfig -s /work-dir/myconfig

Reading silent install file: /work-dir/myconfig
Full install!
CLASSPATH is --- /opt/sun/identity/locale:/etc/opt/sun/identity/config:/opt/sun/identity/lib:/opt/sun/identity/lib/am_services.jar:/opt/sun/share/lib/ldapjdk.jar:/opt/sun/private/share/lib/jss4.jar:/opt/sun/identity/lib/am_sdk.jar

Starting the tag swapping of the install.ldif and installExisting.ldif
ROOT_SUFFIX is o=root
People_NM_ROOT_SUFFIX is People_o=root
SERVER_HOST shilver.dev.knowd.co.jp
DIRECTORY_SERVER shilver.dev.knowd.co.jp
DIRECTORY_PORT 389
USER_NAMING_ATTR uid
ORG_NAMING_ATTR o
CONSOLE_DEPLOY_URI /amconsole
ORG_OBJECT_CLASS sunismanagedorganization
RS_RDN root
USER_OBJECT_CLASS inetorgperson
modifying entry cn=schema
modifying entry cn=schema
modifying entry cn=schema
modifying entry cn=schema
Loading of Access Manager schema into the Directory succeeded
...
nfig : Looking for registered module...
amconfig : Registration successful !
amconfig : Restarting cacao. Please wait...
amconfig : Restart of cacao was successful !
#

... Application Serverの再起動 ...
# asadmin stop-domain
# asadmin start-domain

起動時に、Application Serverのエラーログを確認しエラーがないことを確認してください。
私の環境(Linux)では、次のようなエラーがでました。

:::: server.log ::::
[#|2007-12-24T02:40:20.190+0900|SEVERE|sun-appserver9.1|javax.enterprise.system.container.web|_ThreadID=10;_ThreadName=main;_RequestID=ccd48a3b-abb2-406b-bbb8-aaaa1b32cda1;|WebModule[/amserver]StandardWrapper.Throwable
java.lang.UnsatisfiedLinkError: no jss4 in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1682)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
....

JSS4のライブラリが見つからないというエラーのようです。次のように対応した所、エラーなしに起動するようになりました。

:::: asenv.conf::::
....
AS_NSS="/opt/SUNWappserver-amcontainer/lib:/opt/sun/private/lib"
AS_NSS_BIN="/opt/SUNWappserver-amcontainer/lib:/opt/sun/private/lib"
....

Access Managerのアプリケーションが配備されていることを確認します。

# asadmin list-components
amserver
ampassword
amcommon
Command list-components executed successfully.

http://localhost:8080/amserver/

デフォルトのユーザー名amadminとパラメータファイルADMINPASSWDで指定したパスワードでログインします。

今後のトラブルに備えて、この初期状態のバックアップをとっておくことを進めます。

# cd /work-dir
# mkdir backup
# cd backup

.... application serverのバックアップ ....
# asadmin stop-domain
# asadmin backup-domain
Successfully backed up the domain

Description: 1198434277136
Backup Filename: /opt/SUNWappserver-amcontainer/domains/domain1/backups/sjsas_backup_v00001.zip
Date and time backup was performed: Mon Dec 24 03:24:37 JST 2007
Domains Directory: /opt/SUNWappserver-amcontainer/domains
Domain Directory: /opt/SUNWappserver-amcontainer/domains/domain1
Domain Name: domain1
Name of the user that performed the backup: root

# cp /opt/SUNWappserver-amcontainer/domains/domain1/backups/sjsas_backup_v00001.zip .

.... Directory Serverのバックアップ ....
# dsadm stop /var/ds1
サーバーが停止しました

# cp /var/ds1/config/dse.ldif .

# dsadm backup /var/ds1 ds
[24/Dec/2007:03:26:31 +0900] - Backup starting (ds)
[24/Dec/2007:03:26:31 +0900] - Backing up file 1 (ds/root/root_member.db3)
[24/Dec/2007:03:26:31 +0900] - Backing up file 2 (ds/root/root_mailAlternateAddress.db3)
[24/Dec/2007:03:26:31 +0900] - Backing up file 3 (ds/root/root_owner.db3)
...
[24/Dec/2007:03:26:34 +0900] - Backup completed (ds)
#

... 起動 ...
# dsadm start /var/ds1
サーバーが起動しました: pid=25155

# asadmin start-domain
Starting Domain domain1, please wait.

Book: Access Manager7.1 設定テスト

インストール後、新規Realmを作成し簡単な設定のテストを行います。

Directory Serverへのサンプルデータのインポート

/opt/sun/ds6/ldifにExample.ldifという、サンプルのLDIFが付属しますので、インポートします。

# dsconf create-suffix dc=example,dc=com
サーバーから提示された証明書「CN=shilver.dev.knowd.co.jp, CN=636, CN=Directory Server, O=Sun Microsystems」は信頼できません。
受け入れは「Y」、1 回だけ受け入れは「y」、拒否は「n」、詳細を表示は「d」を入力: y
「cn=Directory Manager」のパスワードを入力:

# dsconf list-suffixes
dc=example,dc=com

# dsconf import /opt/sun/ds6/ldif/Example.ldif dc=example,dc=com
サーバーから提示された証明書「CN=shilver.dev.knowd.co.jp, CN=636, CN=Directory Server, O=Sun Microsystems」は信頼できません。
受け入れは「Y」、1 回だけ受け入れは「y」、拒否は「n」、詳細を表示は「d」を入力: y
「cn=Directory Manager」のパスワードを入力:
サフィックス「dc=example,dc=com」の既存のデータが新しいデータで上書きされます。
レプリケートされたサフィックスで初期化を実行する必要があります。
続行しますか [y/n] ? y
## Index buffering enabled with bucket size 40
## Beginning import job...
## Processing file "/opt/sun/ds6/ldif/Example.ldif"
## Finished scanning file "/opt/sun/ds6/ldif/Example.ldif" (160 entries)
## Workers finished; cleaning up...
## Workers cleaned up.
## Cleaning up producer thread...
## Indexing complete.
## Starting numsubordinates attribute generation. This may take a while, please wait for further activity reports.
## Numsubordinates attribute generation complete. Flushing caches...
## Closing files...
## Import complete. Processed 160 entries in 5 seconds. (32.00 entries/sec)

タスクが完了しました (slapd 終了コード: 0)。

# ldapsearch -b "dc=example,dc=com" objectclass=*
version: 1
dn: dc=example,dc=com
objectClass: top
objectClass: domain
dc: example
...
dn: ou=Company Servers,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: Company Servers
description: Standard branch for Company Server registration
#

Access Managerに上記のDITを使用したRealmを作成します。
Access Managerにログイン( http://localhost/amserver )し、「レルム」で「新規...」を選択します。レルム名を"example"とします。

レルムリストからexampleを選択し、「データストア」を選択します。
「新規...」で新しいデータストアを追加します。

任意の名前をつけます。

LDAPへの接続パラメータを指定します。以下はサンプルです。

LDAPバインドDN: cn=Directory Manager
LDAPバインドパスワード: SCOPE_SUB
LDAP組織DN: dc=example,dc=com
LDAPv3 プラグイン検索範囲:
LDAPグループネーミング属性: (空にする)
LDAPグループコンテナ値: (空にする)
LDAPピープルコンテナ値:(空にする)
LDAPコンテナ値:(空にする)
LDAP エージェントコンテナネーミング属性:(空にする)
LDAP エージェントコンテナ値:(空にする)
持続検索ベース DN: dc=example,dc=com

設定が完了したら、右上の「終了」をクリックします。

設定が有効になっていることを確認するために、「対象」タブを選択し、LDAP内のユーザー(150エントリー)、グループ(5エントリー)等が検索できていることを確認します。

デフォルトでは、100エントリーしかコンソールに表示されないので、「アクセス制御」->「設定」->「コンソールプロパティー」->「管理」の「レルム属性 - 検索で返される結果の最大数:」を大きな値(200等)にしておきます。

レルム - example 内の「認証」タブを選択します。モジュールインスタンスに新しい認証もジュールを追加します。「新規...」をクリックし、dc=example,dc=comを対象とする、LDAPモジュールインスタンスを追加します。

デフォルトの認証連鎖をDataStoreに設定しておきます。

Access Managerコンソールからログアウトし、新しく作成したレルムで認証します。

http://localhost/amserver/UI/Login?realm=example
で、ブラウザからアクセスします。ユーザー名とパスワードは、Example.ldif内のユーザーのいずれかを指定します。 例) scarter / sprain

設定が成功していれば、以下のようにユーザーのプロファイルが表示されます。

Book: OpenPortalのビルド

OpenPortalは、Sun Java System Portal Server 7.1のソースコードをベースとしたポータルサーバーのオープンソースプロジェクトです。 https://portal.dev.java.net/

ここでは、OpenPortal 7.2 Build 11 (2007/12/24の時点で最新)をビルド、インストールしてみます。
Instration Note( http://wiki.java.net/bin/view/OpenPortal/PortalInstallInstructions )を見ると、Portal Serverは、Sun Java System Access Managerを必要としますので事前に用意しておきます。Access Managerのインストールはこちらにまとめています。

OpenPortal7.2は、まだ、バイナリー配布されていないようで、ソースコードからビルドします。
http://wiki.java.net/bin/view/OpenPortal/PortalBuildInstructions

以下のSubversionリポジトリからチェックアウトしていきます。ユーザー名はguestを使用します。

# svn checkout https://portal.dev.java.net/svn/portal/trunk/portal portal
...
A portal/sharepoint/src/com/sun/portal/sharepoint/SPSoapRequest.properties
A portal/sharepoint/src/com/sun/portal/sharepoint/SPPermission.java
A portal/sharepoint/src/com/sun/portal/sharepoint/UserGroup.java
A portal/sharepoint/build.xml
リビジョン 2119 をチェックアウトしました。

# cd portal
# svn info
パス: .
URL: https://portal.dev.java.net/svn/portal/trunk/portal
リポジトリのルート: https://portal.dev.java.net/svn/portal
リポジトリ UUID: 6ab8a9c0-c32e-0410-825b-dcba3c54f24a
リビジョン: 2118
ノード種別: ディレクトリ
準備中の処理: 特になし
最終変更者: uppalapati
最終変更リビジョン: 2117
最終変更日時: 2007-12-23 05:07:07 +0900 (日, 23 12月 2007)

OpenPortalをビルドします。(ビルドにはJDK1.5が必要で、JDK6では失敗します。環境変数JAVA_HOMEにJDK1.5を指定してantを実行します。)

# ant package
ant package
Buildfile: build.xml
...
linuxPackaging:
[echo] Building RPM directory structure
[mkdir] Created dir: /root/portal/portal/packaging/build_rpm
[mkdir] Created dir: /root/portal/portal/packaging/build_rpm/BUILD
[mkdir] Created dir: /root/portal/portal/packaging/build_rpm/RPMS
[mkdir] Created dir: /root/portal/portal/packaging/build_rpm/SOURCES
[mkdir] Created dir: /root/portal/portal/packaging/build_rpm/SPECS
[mkdir] Created dir: /root/portal/portal/packaging/build_rpm/SRPMS
[copy] Copying 2 files to /root/portal/portal/packaging/rpms
[delete] Deleting directory /root/portal/portal/packaging/build_rpm

windowsPackaging:
package:
mobilePkgs:
all:
BUILD SUCCESSFUL

Solaris 10 x86 + Sun Studio 12でのビルド:
警告は多くでるのですが、一発でビルドに成功しました。

...
package.args:
[echo] productName = Mobile Access
[echo] productVersion = 7.2
[echo] packageName = SUNWammae
[echo] productDir = SUNWam
[echo] pkgMakeExtraDef =
solarisPackaging:
linuxPackaging:
windowsPackaging:
package:
mobilePkgs:
all:
BUILD SUCCESSFUL
Total time: 31 minutes 9 seconds

Fedora8でのビルド:
Fedora8ではCのプログラムでコンパイルエラーが発生しましたので、2点ほど手を加えました。

変更点1)
以下、コンパイルエラー
::::: search/ns/netsite/batman/server/robot/src/dsenum.c:::::
BEFORE) 3066: static void dsenum_load_data_sources(EnumObject *eo)
AFTER) 3066: void dsenum_load_data_sources(EnumObject *eo)

変更点2)
...security/pam_appl.hが見つからない...
# yum install pam-devel

次に、パッケージを作成します。

# cd image
# export JES_LOCATION=".../java_es-5u1-ga-linux-x86/Linux_x86
# ant
...
BUILD SUCCESSFUL
Total time: 15 seconds

Book: OpenPortalのインストール

build/PS7.2_Linux_x86ディレクトリの下に作成されたインストーラーを実行します。

... Fedora8では libstdc++-libc6.2-2.so.3が必要でした。
# yum install libstdc++-libc6.2-2.so.3

... インストール中、asadminを起動するantスクリプトの失敗を防ぐために...
# asadmin change-master-password --savemasterpassword=true
Please enter the new master password>
Please enter the new master password again>

... JDK 1.5を使用する。...
# cd build/PS7.2_Linux_x86
# ./installer

GUIインストール時のスナップショット





コンフィギュレーションが完了するとデフォルトのポータルが作成されます。また、いくつかのWebアプリケーションがApplication Serverに配備されています。

# psadmin list-portals -u amadmin
パスワードを入力してください:
ドメイン: defaultDomain
============================================
ポータル: portal1
--------------------------------------------
インスタンス: shilver-8080
ホスト: shilver.dev.knowd.co.jp
ポート: 8080
Web コンテナインスタンス: server
============================================

# asadmin list-components
amserver
ampassword
amcommon
...
search1
jackrabbit-jca
wssbrowserportlet
workflowPortlet
communitymanagerwebservice
communityportlets
dmportlet
psconsole
blogportlet
surveys
rssportlet
articleMgmt
portal
wssportlets
wiki
ccd
filesharing
Command list-components executed successfully.

http://localhost:8080/psconsole で、管理サーバーにアクセスできます。ユーザー名とパスワードはAccess Managerの管理者のものを使います。

http://server.domain:8080/portalで、デフォルトのトップページにアクセスできます。(localhostではcookieのエラーがでました) Access Managerの認証が必要です。必要なければシングルサインオンが働いています。

http://server.domain:8080/portal/welcomeで、別のページが表示されます。「エンタープライズポータル」や「サンドボックスサンプル」はまだインストールされていません。

It's snow!

雪が降ります。
DHTML Snowstorm http://www.schillmania.com/projects/snowstorm/

Japanese Dell online store compliants to none IE.

ブラウザがIE、またはWindowsでなくては利用できないサイトはいくつかあります。

たとえば、村上龍のビデオ(トーキングエッセイ)を見ることができる、MicroSoft Networkの"Ryus Video Report 龍言飛語"はおもしろく、自分にとってためになるので、毎週みているのですが、スポンサーがMicrosoftのためかIE + Media Playerでなくてはみられません。


また、読売新聞のサイト、Yomiuri Onlineでもニュースやインタビューの動画を流していて、なかなか充実しています。こちらはブラウザは何でも良いのですが、Microsoft Media Playerでなくてはみることができません。

また、オンラインで講義を受け、単位を取ることのできるある大学なども、コンテンツはMicrosoft Windowsにしか対応していないようです。この場合は、受講生はWindowsの購入が条件となるのでしょうか・・・?。

私が仕事で使うことの多い日本のDellのサイトもちょっと前まで、IEでなくてはオンラインのオーダーができませんでしたが、先日、アクセスしてみたら改善されていて非常に使い勝手良い洗練されたデザインになっていて、FirefoxやMozillaでも利用できるようになっていました。

クライアントとして使用されるコンピューターの多数派がWindowsだとしても、それは、現在の状況であり、今後は変動する可能性もあります。複数のブラウザやプラットフォームに対応させることは、コンテンツ作成を困難にしますが、プラットフォームに依存しないような状態が好ましいです。

Identity Manager, CLI Install to Sun Java System Application Server 9.1

Sun Java System Identity Manager 7.1をCLI (Command Line)からSun Java System Application Server 9.1へインストールしてみます。

Identity Manager 7.1のリリースノートにはApplication Server 9.xへのサポートは表記されていませんが、インストレーションノートには、Platfom Edtion 9について言及されています。また、Identity Manager 7.1 update 1には、Application Server 9.xのサポートが明記されています。

Identity Manager 7.1(Not Update1)を、Application Server 9.xへインストールするのは正式にはドキュメンテーションされていないので、注意が必要です。以下の手順は基本的にApplication Server 8.xと同様に行っていきたいと思います。

インストール方法は、以下にドキュメンテーションされています。
インストール: http://docs.sun.com/source/820-2276/index.html
Application Serverへのインストール: http://docs.sun.com/source/820-2276/Ch8_java8.html

事前に、Application Serverのインストール、リポジトリーデータベースの起動、スキーマの作成は完了していなければなりません。

# mkdir /sjes/idm-stage

# cd /unziped-idm-software-package

# ./install

You are running the installation program for Sun Java System Identity Manager.
This program asks you to supply configuration preference settings that it uses
to install Sun Java System Identity Manager

The installation program consists of one or more selections that provide you
with information and let you enter preferences that determine how Sun Java
System Identity Manager is installed and configured.

    
...
   Is this a new installation? [y/n]y

   Directory to install Sun Java System Identity Manager components into
   [/idm]: /sjes/idm-stage/idm

The directory "/sjes/idm-stage/idm" does not exist.

Do you want to create it now or choose another directory?

1. Create Directory
2. Choose New

   Enter the number corresponding to your choice  [1] 1

Checking disk space...


The following items for the product Sun Java System Identity Manager will be
installed:

Product: Sun Java System Identity Manager
Location: /sjes/idm-stage/idm
Space Required: 176.88 MB
-----------------------------------------
Identity Manager Component


Ready to Install

1. Install Now
2. Start Over
3. Exit Installation

   What would you like to do [1] {"<" goes back, "!" exits}? 1

Installing Sun Java System Identity Manager
|-1%--------------25%-----------------50%-----------------75%--------------100%|


Installation details:

     Product                           Result     More Information
 1.  Sun Java System Identity Manager  Installed  Available

2. Done

   Enter the number corresponding to the desired selection for more
   information, or enter 2 to continue [2] {"!" exits}: 2

これで、ステージディレクトリへファイルがコピーされます。 次に、リポジトリデータベースに接続できるように、JDBCドライバーや言語パックなどの追加jarファイルをステージディレクトリ(の下のidm/WEB-INF/lib)にコピーし、WARファイルを作成しApplication Serverにデプロイします。
...各種jarファイルをコピー...
# cp mysql-connector-java-5.0.8-bin.jar /sjes/idm-stage/idm/WEB-INF/lib/
# cp idm_l10n_ja_JP.jar /sjes/idm-stage/idm/WEB-INF/lib/

# cd /sjes/idm-stage/idm
# jar cvf ../idm.war .
...adding: WEB-INF/lib/openspml.jar(in = 187219) (out= 174214)(deflated 6%)
adding: WEB-INF/lib/openspml2-toolkit.jar(in = 259944) (out= 231866)(deflated 10%)
adding: WEB-INF/lib/idmspe.jar(in = 524874) (out= 500675)(deflated 4%)
adding: WEB-INF/lib/idm.jar(in = 5062694) (out= 4869869)(deflated 3%)
adding: WEB-INF/lib/mysql-connector-java-5.0.8-bin.jar(in = 540852) (out= 521482)(deflated 3%)

# cd ..
# ls
idm      idm.war

# asadmin deploy idm.war
Command deploy executed successfully.

# asadmin list-components
idm 
Command list-components executed successfully.

次に、lhコマンドが使えるようにするために、環境変数WSHOMEとPATHを設定します。
:::: .bashrc ::::
WSHOME=/opt/SUNWappserver/domains/domain1/applications/j2ee-modules/idm
export WSHOME
PATH=....:${WSHOME}/bin

# . /.bashrc

# chmod +x /opt/SUNWappserver/domains/domain1/applications/j2ee-modules/idm/lh

# lh
Usage: lh [ $javaopt [ $javaopt... ] ] { $class | $command } [ $arg [ $arg... ] ]

class:    a fully-qualified class name);
          (e.g., com.waveset.session.WavesetConsole)

command:  one of the following command names:
    import
    console
    setup
    js
    javascript
    waveset
    setRepo
    xmlparse
    xpress
    form
    genReports
    config
    upgradeViews
    msgtool
    doc2html
    spml
    assessment
    syslog
    script

Examples:
    lh com.waveset.session.WavesetConsole
    lh console
    lh console -u $user -p $password
    lh setRepo -c
    lh setRepo -tlocalfiles -f$WSHOME
    lh -Xmx128M console
    lh "-Dtrace.enabled=true" "-Dtrace.methods=com.waveset.task" console

lh setRepoコマンドを使ってリポジトリのセットアップを行います。
# lh setRepo

Usage: setRepo [location_flags] [options]
...
Examples:
    setRepo
    setRepo -c
    setRepo -tLocalFiles -f$WSHOME
    setRepo -tOracle -hhost.your.com -p1521 -ddbname
    setRepo -tOracle -ujava:oracle:thin:@host.your.com:1521:dbname
    setRepo -tOracle -icom.sun.jndi.fscontext.RefFSContextFactory -fjdbc/SampleDB
    setRepo -tMysql
    setRepo -tMysql  -ujdbc:mysql://localhost/waveset
    setRepo -tSQLServer -ujdbc:sqlserver://host.your.com:1433;DatabaseName=dbname
    setRepo -tDB2    -ujdbc:db2://host.your.com:6789/dbname
    setRepo -tDB2    -ujdbc:db2:dbname -jCOM.ibm.db2.jdbc.app.DB2Driver


...以下MySQLの場合...
# lh setRepo -tMysql -ujdbc:mysql://localhost/waveset -U waveset -P waveset
Starting internal database server ...
Cannot reach current repository location:com.waveset.util.ConfigurationError:
==> java.sql.SQLException: Connection is broken: java.lang.OutOfMemoryError: Java heap space

...エラーとなりますので、-nオプションをつけると良いでしょう...
bash-3.00# lh setRepo -n -tMysql -ujdbc:mysql://localhost/waveset -U waveset -P waveset
Starting internal database server ...

==> java.sql.SQLException: Connection is broken: java.lang.OutOfMemoryError: Java heap space
Attempting to force new Index location by overwriting config file '/opt/SUNWappserver/domains/domain1/applications/j2ee-modules/idm/WEB-INF/ServerRepository.xml'...
...Successfully forced 'MysqlDataStore:jdbc:mysql://localhost/waveset' as the new Index location.

Identity Manager側にデータベース接続に必要な情報がセットアップされます。最後に、リポジトリの初期化を行うためにsample/init.xmlファイルをインポートします。
# asadmin stop-domain
# asadmin start-domain
# lh import -f /sjes/idm-stage/idm/sample/init.xml
Including file 'sample/speLoginConfig.xml'.
...
Restored LoginModGroup:Default SPE Id/Pwd Login Module Group
Restored LoginApp:SPE User Interface
Including file 'sample/speLinkingPolicyForm.xml'.
Restored UserForm:SPE Linking Policy Form
#
アプリケーションサーバーにアクセスします。 http://localhost/idm 初期ユーザー名とパスワードは configurator/configurator です。

BABEL(DVD)を観た。

妻は映画に明るいので、好きだけどあまり明るくない私は「最近の映画ってさ・・・」といって彼女と映画の話をすることは、とても楽しい時間だ。

最近の映画の話をすると、アレハンドロ・ゴンサレス・イニャリトゥ(Alejandro González Iñárritu)の21GramsやBABEL、ポール・ハギス(Paul Haggis)のクラッシュ(Crash)の話になる。私は、そこにマイケルムーア(Michael Francis Moore)を加えようとするが、彼女はあまり好まないようだ。

BABELにおいて、ブラッドピットやケイトブランシェットは必要だったかどうかや、少年の自慰行為や鶏をしめるシーン等の必然性やマーケットでの扱われ方、また、複数のストーリーの時系列が入り乱れることの意味について、いろいろ考え、話したが、お互い、この映画を深く認めていると思った。この映画は様々な点において深く考えさせられ、ロマンティックであり、そして、何より映像と音楽が美しい。

モロッコでの空、丘陵、老人のしわ、少年の眼、素朴な生活ぶり、東京の孤独で寂しげで軽薄で寒々しい景観と肉体の行き場のないような感触、アメリカ人夫婦の危機なしにはいたわりあえない倦怠感と子供に対する愛情、メキシコ人ベビーシッターの報われない誠実さや愛情・・・等など・・・非常に多彩な要素を・・・言葉では表現しにくい何らかの観念、情熱がひとつの作品に結び付けている。結び付けようとしている。

様々な賛否があると思うが、私は、イニャリトゥ監督のBABELには未来があることに疑いを持たない。私の妻は、彼の作品には「優しさと暖かい眼差しがある」と言って私の浅い感想をより深いものにしてくれる。

少年の自慰行為、聾役の菊地凛子の全裸、ケイトブランシェットの放尿、鶏の首を切り落とすシーンなどは、いずれも社会的なモラルと抵触することになり、映画マーケットから倦厭されることだろう。
しかし、その少年は家族を救うために命を投げ出すし、少女は最後の生命力を振り絞るし、アメリカの中産階級の夫婦は最悪の状況で絆を取り戻す、鳥をしめるシーンを見せられた子供たちは、その事実を知らないままフライドチキンを消費している。良心的な婦人の誠実さは報われないままだ。

「簡単ではないのだ」といっている。簡単に壊れるのだ。同感だ。難しい。でも、21Gramsでも一貫して言われているが「それでも人生は続いていく」。さらに、難しさの中の希望を映像と音楽できちんと表現しきっていると感じた。

私の妻が言った言葉が本質だと強く思う。誰も見ていない、誰にも評価されない優しさや暖かさ、それで何とか世界が維持できているのだということを考えると、謙虚な気持ちにさせられる。

Babelで使用されている非常に美しく印象的なBGMが、日本の音楽家、坂本龍一の"bibo no aozora"だということは、映画を見た後、NHKの坂本龍一と役所広司の対談番組を偶然見て知った。大々的に「日本人が出ています!」と報道されないのは、映画の性格によるものだと思うが、このように非常に質の高い作品に、日本人が深く関わっていること、そして非常に重要な役割を演じていることは、とても元気の出ることだ。とてもすばらしい関わり方をしていると思う。 坂本龍一はYMOや飯島真理のプロデュース、矢野顕子との結婚と離婚などのイメージが強く、失礼ながら、とらえどころのない印象を持っていて、ラストエンペラーでアカデミー賞を受賞した時でさえ、そのイメージがあったのですが、"bibo no aozora"を真剣に弾いている彼の姿を見たとき、音楽に対する真剣さと情熱を感じることができ、「音楽家」という職業がイメージできました。彼自身も変化しているのかもしれませんが、人を表面的な態度や印象だけで認識するのは良くないと思いました。 もし、マーケット的にうまくいかなかったとしても、商品ではなく、作品として、またはメッセージの意味についてもっと多くの人がこの作品やメッセージ、情熱について語っても良いように感じるが、今の日本では、「話す」より「黙して為す」ほうが賢明な反応なのかもしれない。 こういった作品ならば、私は買って手元においておきたいと思う。そして、生き方に迷ったときに、妻と話したときのことを思い出そう。

TITANICを観た。

私は見た映画を悪く言うことをしたくない人間です。面白くなければ、「面白くなかった」の一言で終わりにしたくて、面白くない理由を分析するほど、映像やストーリーを作る作業に携わっていません。作った人は、見る人より多くのものをそこに注いでいると思っています。ですから、作品を届けてくれた人たちには、感謝します。そして、いつも最後に、「自分なら何がやれるか」を問うことになります。私は、人に影響を与えることができるような、感動を与えることができるような、幸せになってもらえらえるような、自分なりの方法を持つのかと考えます。映画は作れませんが、べつの形で何かできるのでかと・・・。

 船が沈没して、たくさんの人が死んだ話です。死ぬことの怖さよりも、今私が、生きていることの意味を考えました。生きると言うことは、死んでいるよりたくさんの可能性があるんですね。例えば、うまいものを食いたいとか、好きな人に会いたいとか、自分の趣味をやりたいとか、自分の仕事をうまくこなしたいとか、考え、それを、実行することができる。でも、ただ生きていたのでは、案外、そんな欲望も起きなかったりします。また、欲望だけが人を活かしているわけでもないなぁ・・と思うのです。

 生きることの意味というのは、人によって、全然違うと思うのですが、それを感じるには、いくつかの条件がいるということだと思うのです。タイタニックでは、主人公の男性が、最も「生きている」ということをしていたと思います。しかし、その他の人たちも又、死を目前にして必死に生きようとしていました。金を使って生きようとした人もいました。それも又、人間でしょう。私は良くないことだと思いますが、それはそれで一つの方法です。

 船はどんどん沈んでいきます。この沈み方の絵は、とても恐ろしく、美しいものでした。

 生きることの意味、と言いました。これを道徳的な規範に従うことだとは思っていません。現実は、夢うつつです。長いようで短く、瞬間は永遠であると思っています。過去に起こった(もしかしたら生まれる前の記憶かもしれない)幸せな出来事を、私の体は覚えているのでしょう。幸いなことに、私は生まれてきたことを嬉しく思っています。自分の思うに任せて、進む。これが、最も大事なことです。月並みですが・・・。

J.Cameronは、映画を作りたくて作ったのでしょう。True liesという作品は、私に感動を与えませんでしたが、Titanicはとても面白い作品でした。私を元気にさせます。お金を持たない人たちが、狭いところで、音楽に合わせて踊るシーンは大好きです。幸せとは、踊って、疲れて、寝て、次の日、朝日と共に、何か得体の知れない活力と予感を感じる、ということで、銀行に預けてある貯金がそのバロメータではないと思います。 何が自分を幸せにするのか。何をすれば幸せになるのか。その方法を知っている人が、賢い人です。

私は、愚かな人間ですが、あきらめていません。数時間後に死ぬとわかったとき、私はどうふるまうのでしょうか。それは、わかりません。今はそうではないので、やれることをゆっくりとやろうと思います。数十年後(残り、だいたい、三十年くらい何だろうか・・・平均寿命と比較して)には、明らかに死んでいるのは確かですが・・・。

もののけ姫を観た。

とても面白い映画でした。

宮崎駿でなくては、作り出せないであろう何かを感じ、彼の作品が、今後、コンスタントに見ることができなくなるかもしれないことは、とても寂しく感じます。
彼の作品は、彼の体臭であふれています。それは、私を幸福な気持ちにさせます。

「風の谷のナウシカ」を原作で読んだとき、私は、「勧善懲悪で割り切れない何か」と、「現状を生きるときに必要なあきらめ(虚無)」と、「より良き道を探す」という、3つのキーワードについて考えました。私が、17才の時だと思います。もののけ姫では、特に、「より良き道を探す」という事が強調されているように思いました。

現実を、私なりに真剣に見て、人に語るとき・・・・、対象は誰にたしてでもいいのですが、例えば、職場で共に働いているに、私より若い人と話すとき、「頑張ればきっと幸せになれるよ!」と言うことは、安易なことです。しかし、自分がそれを心から信じているかというと、ある部分本当であり、ある部分嘘です。

できれば、嘘はつきたくないので、正しく話そうとしますが、そこまで話す動機も、そこまで聞く人もいなくて、中途半端な解説を付けて、又、嘘の上塗りをしています。「諦め」は「悟り」であるかもしれません。それは中途半端な「夢」よりも、正しいことかもしれません。

もののけ姫には、ナウシカにあった、オームの目が、青く変わっていくというような、壮大なカタルシスは用意されていません。「共に生きよう」という言葉が最大の、終演です。

考え方の違うもの同士が・・・それが如何に些細なことであっても、共存する事が、如何に難しいかは、世界各国の紛争を見れば想像できますし、又、私の勤務している、会社の中を見ても分かります。「あなたと私、共存する必然性があるのか、ないのか」という部分を考えてしまいます。これは、少し、寂しい問いです。共存する必然性を考えたとき、単に利害に向かうのは、人間的ではありません。人間的とは・・・つまり、考え方も、習慣も、宗教も、人種も、越えたところでの、共通の何かを大事にすると言うことです。

最終的な答えを、妥協(虚無)とする事は、先に言ったとおり、「悟り」かもしれません。あるがままのものを受け入れ、平常心を保つ・・・・。(これは、仏教用語で言うところの、正しい「悟り」の使い方とは違うと思います。妥協は悟りとイコールではないでしょう)

明らかに言えることは、現在、「頑張れば幸せになれる」という、非常に構造化された、わかりやすい因果関係に対し、素直に向かえないと言うことです。

私は、私なりに答えを出すことをやめたくありません。だんだん疲れてきているのは確かですが・・・。

もののけ姫は、直接的には、何が正しいかの結論を出していなかったように思います。それに、リアリティを感じます。

「森」と「タタラ場」は、利害が一致しない者どおしの象徴です。そして、それをどのように結びつけるかの結論はでませんでした。それは、銀幕やテレビの中だけで「仮想的に」解決されるべき安易なテーマではなく、現実の中で、考えていく事でのみ、本当に解放された気持ちになると思います。

宮崎駿は、結局、安直な道をとらなかったのでしょう。私は同意します。
それでも、エンターテイメント(娯楽)として、どきどき、わくわく、する作品になっているところに、すばらしさを感じます。

嘘でもいい、笑っていたい。
それだけで、果たしていいのでしょうか?
できれば、「本当に心から笑っていたい」訳で・・・・

このリアリティを受け、小さい子供達(小学生や、中学生、又は、それ以下の・・・)は、どのように感じたのでしょうか?私には、既に、純粋に、この世界に埋没する感受性なくなりつつあります。
「共に生きよう」というメッセージを、子供達はどのように受け止めたのかな? アニメファンではなしに・・・・。

A.I. を観た。

「母親に愛されない機械の子供」「ひたむきに愛を求める子供」「虐待される無垢な子供」、そして、最後に、一日だけ夢がかなえられる。

すばらしい演技力を持った子役と、ハリウッドの撮影技術を駆使してつづられる「ピノキオ」は、とにかく、泣ける。

映画館の出口で、若い人が「俺、こういうのだめなんだよ。」といっていたが、人間には、涙のつぼというのがあるらしい。私も普通の人だから、このつぼを押されてしまったし、字幕も読めないし、英語を理解しない娘(5歳)も、最初は退屈していたようだったが、涙を流していた。

この涙はいったい何なのか? 感動か? 違う・・・。

バビンスキー反応のようなものだ。つまり、こうすれば、ああなるという、条件反射だ。そういう効果がこの映画にはある。

全体を覆う、暗い、ペシミスティックな雰囲気は、SFはそういうものが多いので、特に気にならなかった。

以前(10年以上前)、ピノキオの実写版を見た(きがする)。個人的には「気持ち悪かった」が、ピノキオの持つ孤独感がわからなくもなかった。「人間になれば愛される」とひたむきになる主人公が、かわいそうだった。と同時に、人間じゃなければ、愛さない人間にひどく恐怖した。

私は子供を持っているが、かわいいからという動機はほとんどなく、ほおっておくと死んでしまう、何をしでかすかわからない、という責任感が大きいように思う。その責任感があって、愛情に現実味を与えていると思う。でも、3人の子供は私にとってとても大切なもので、幸せにしてくれるよ。

この映画は、人間であることに感謝させてくれる。

また、テクノロジーのリアリティという観点では、もし、人間の代用品が現れるとしたら、映画で出てきたような問題も出てくると思う。「セックス・ロボット」などは本当に便利かもしれない。そして、彼女に「私とロボットとどっちが大事なの」と言われることになるよな。で、ロボットのほうがいいって男もでてくる。

映画では、母親は自分の息子を守る目的でロボットを手放すけれども、もし、人間に対し機能としてしか見なければ、何がロボットではなく、人間を選択する動機になるのだろうか?

映画の冒頭で述べていた、「愛される側の責任」なのだろう。「責任」の設定は、常に道徳に基づいた人間がすべきことです。つまり、人間の感覚がなければ、人は常に、ロボットやシステムに支配される可能性を十分持っていると思う。また、支配ではなく、ロボットのようになってしまうことも十分ありうる。そういった意味では、愛情がインプリントされた主人公のロボットは、人間以上に愛すべきロボットだと思う。あの、ぬいぐるみも。

千と千尋の神隠しを観た。

「もののけ姫」を作り終えた宮崎駿は、引退宣言をしていたが、まだ作る気力が残っていたことが頼もしく思えます。こういった嘘は、大歓迎です。よくぞ、戻ってきてくれました!

5歳の娘とともに、有楽町の映画館に、朝早く起きて見に行ってきました。

私は30歳です。5歳の子供とは感じとるものがぜんぜん違うと思います。きっと、娘のほうが宮崎監督の発するメッセージを正確に感じ取るはずです。なぜなら、作品に没入する感性をまだ持っているはずだからです。物語が始まり、お父さんとお母さんが豚に変貌したあたりから、娘は主人公に同化し始め「どうしよう」と不安になったでしょうし、夕焼けが迫った美しい風景を見て現実の時間から離れ作品の時間軸の中で考えていたことでしょう。

この作品は(これだけに限らないと思いますが)、宮崎駿と娘とのコミュニケーションで、親である私は入り込む余地があまりないと思いました。

社会の基盤のもっとも重要なものが経済であると、錯覚していたことに気づかされます。経済のシステムは無機質に存在していますが、それに関わっているのは感情を持った人間です。生まれ、死んでいきます。生きていくためにシステムは無視できるものでありませんが、システムと個人は同レベルで比較できるものでありません。そして現代のシステムは主に人を憂鬱にします。生きてはいけるシステムですが、それと引き換えに、個をおびえさせているように思います。システムは必要ですが、今は、実際の生活にマッチしていないように思えてなりません。

「個」について考えるのは、私の癖ですが、最近考えるのは、個が連携できなければ、個として完成しきれていないのではないかと思っています。個を持って、他人に対する接し方を考え、個をもって、全体を意識しなければ、単なる経済の生産・消費単位に過ぎないのではないかと思ってしまうのです。

しかしながら、全てに対して博愛精神をもてというのは到底不可能ですし、私はそうはなりたくありませんし、なれません。それらは、経験の中で芽生えるもので、慎重に、ゆっくりと時間をかけて伝わっていくように思います。

人は、本当に巨大な力を持っています。その力は、経済というリトマス試験紙だけでは図られていません。人の努力、力、愛情は、風へと消えゆきます。それらは、経済のシステムに量られて現れてくるものでは決してありません。個の持つ奥深い愛情は、風に乗って多くの人に伝わり、目に見えない、大きな循環を生み、人が生きていくための糧になっていると思います。

「愛情」という言葉を使いましたが、それ以外の言葉が見つかりません。これを使わずに、これを説明するのが、感想文として正しいのでしょうけれど。

多くの娯楽が街にあふれています。映画もその娯楽のひとつです。しかし、この作品は、日本という地域を考えたうえで、私は日本人であるということをはっきりと堂々と宣言した上で、われわれの生き方に深く関わる作品となっていると思います。

宮崎駿は次のように述べています。

"ボーダーレスの時代、よって立つ場所を持たない人間は、もっとも軽んぜられるだろう。場所は過去であり、歴史である。歴史を持たない人間、過去を忘れた民族はまたかげろうのように消えるか、ニワトリになって喰らわれるまで玉子を産みつづけるしかなくなるのだと思う。"

自分が何者であるかを忘れることは悲劇だとおもいます。自分に自信が持てないこともそうです。そして、自信は積み重ねと努力、そして優れた知恵から生まれるものです。維持と忍耐が必要で、それを続けるには希望が必要です。

私は、この作品は「大好き」です。

 

いつも何度でも
作詞/覚和歌子 作曲・歌/木村 弓

呼んでいる 胸のどこか奥で
いつも心踊る 夢を見たい

悲しみは 数えきれないけれど
その向こうできっと あなたに会える

繰り返すあやまちの そのたびひとは
ただ青い空の 青さを知る
果てしなく 道は続いて見えるけれど
この両手は 光を抱ける

さよならのときの 静かな胸
ゼロになるからだが 耳をすませる

生きている不思議 死んでいく不思議
花も風も街も みんなおなじ

呼んでいる 胸のどこか奥で
いつも何度でも 夢を描こう

悲しみの数を 言い尽くすより
同じくちびるで そっとうたおう

閉じていく思い出の そのなかにいつも
忘れたくない ささやきを聞く
こなごなに砕かれた 鏡の上にも
新しい景色が 映される

はじまりの朝 静かな窓
ゼロになるからだ 充たされてゆけ

海の彼方には もう探さない
輝くものは いつもここに
わたしのなかに 見つけられたから

シンプルな、小学校唱歌のようなこの歌が、とても素敵に聞こえます。生きるための力というのは、案外とても単純な形をしているのかもしれません。

多様性の利点とコスト,Fedora8, Epson PM-T960

平成20年、2008年1月10日、参議院で一旦否決された法案、略称「テロ対策特別措置法」、実名は「平成十三年九月十一日のアメリカ合衆国において発生したテロリストによる攻撃等に対応して行われる国際連合憲章の目的達成のための諸外国の活動に対して我が国が実施する措置及び関連する国際連合決議等に基づく人道的措置に関する特別措置法」と、文章のような、絶対に覚えることのできない名前がつけられた法案が、衆議院で再可決された。

衆議院と参議院の役割は、確か小学校か中学校で習ったはずで、正確ではないかもしれないが「国の大事を慎重に決定するための仕組み。参議院はチェック機構である。」と理解している。最終的には、参議院でダメと言われた法案であっても、衆議院で再検討して決定する、というルールだったことはうっすらと覚えている。

仕組みよりも、テストにパスするために、どっちがどっちだったかを暗記することに脳みそを使った記憶があるが、大事なのは、二つに分けてある事柄について良い点と悪い点をそれぞれで検討した上で決めるという思慮深い良いシステムだなとは感じていた。

今、社会科を勉強している小学生や中学生にとっては、ナントカ流星群と同じくらいタイムリーな勉強素材になりうるのだが・・・昭和32年(1957年)「環境衛生関係営業運営適正化法案」あるいは昭和26年(1951年)、57年前の「モーターボート競争法」以来とのことで、競争法は胴元と博打打ちを奮い立たせただろうが、今回の「テロ対策特別措置法」は素材としては明るい要素をあまり感じない。少なくとも、反対する人が大勢いる状態で決められた法案であることは忘れ無いようにしておくべきだろう。

驚くのは、参議院で否決され、衆議院で再可決というケースが、50年間無かったということだ。

約50年間、参議院で否決された法案が無かったのだ。これまでの、参議院の人たちの仕事のアウトプットが何であるかを私は知らないが、否決まで行かなくても、修正案等を出していたのだろうか? これまで衆議院と参議院は今まで大きな対立をしてこなかったのだろうか? または、どのような対立、葛藤があったのかは、国内に限らず調べてみたい気がする。参院での意見が盛り込まれている場合もあるだろうし。

今回のケースを受けて、ある作家が「二大政党は政策転換が必要になりコストがかかり、イギリスはそのコストを嫌って保守政権を長く維持する選択を国民がした」と話していました。

確かに、ある単一の価値観や勢力を長く維持すれば、やってきたことの経験や財やコネクションが蓄積されて、あれやこれや考えずに、混乱せずにいられるかもしれない。しかし、では、なぜ、そもそも衆議院と参議院や、上院と下院、労と使、何々政党等の対立する可能性のある構造が存在するのか?

一言で言うと、対立構造がないと「考え方の幅や深さがなくなってしまう」のだろう。

基本的に、あることを行うために、多様性を認めたり、常に対立していたのでは効率が悪い場合が多い。正にコストがかかるし、やろうとしていたことができなくなってしまう可能性が出てきて既得権益層には都合が悪い場合もあるだろう。

しかし、それは基本的に「画一化による危険」を回避するためのコストと考えて良いと思う。私は、与党と野党の対立などに、まったく興味は無い。明確に対立する主張を感じないし、どちらがどちらなのかよく分からない。法案を通したがっていたのが与党で、それを阻止したかったのが野党くらいの認識だが、どちらにも私に分かる主張は届いてこなかった。

大事なのは、そのコストをかけ、その過程を経て、コスト以上のものを生み出すことだ。そうでなければ、井戸端会議に多大なコストをかけていることになる。これを達成するのは容易ではないと思う。

前置きが長くなったが、政治的なことを言いたい訳ではなく、Epsonのプリンター、PM-T960を購入し、最近のプリンターがなんと高性能なのだ! と驚いたことと、Linux (Fedora8)で印刷ができたんだ! ということと、その作業をしながら考えたことを言おうとしたのだが・・・、時間となってしまったので、これまでのものを推敲する元気もなくなってきました・・・・ひとまず寝ようと思います。

続き…
http://www.knowd.co.jp/yamazaki/?q=node/63

参考資料:
NSN 産経ニュース / 再可決をモーターボート競争法以来57年ぶりとしている
http://sankei.jp.msn.com/politics/policy/080110/plc0801101059002-n1.htm
All About -よく分かる政治- 辻 雅之(つじ まさゆき)さん / 再可決を50年ぶりとしている
http://allabout.co.jp/career/politicsabc/closeup/CU20071115A/index.htm
WikiPedia
http://ja.wikipedia.org/wiki/%E3%83%86%E3%83%AD%E5%AF%BE%E7%AD%96%E7%89%...

Sun, MySQL ABを取得!

現在、日本時間で1月17日午前8時ですが、SunがMySQL ABを8億ドル($800million)の現金で、MySQL社を取得したとのことです。

追加(2008/2/4):日本Sun(サン・マイクロシステムズ株式会社)より、2月1日に日本語での発表がされています。
http://jp.sun.com/company/Press/release/2008/0201.html

AOLを経由したNetscape製品の取得、Forte, StartDivision, Cobalt、Waveset、StrageTek, SeeBeyond・・・

これまでの買収の経緯からみると、MySQL ABの取得は、これまでになく未来に明るいものに感じ、非常に突拍子もないニュースではありますが、よく考えると、必然性も感じます。政略結婚ではなく、恋愛結婚なのでしょう。こういったことは突然起こるのですね。

MySQL側の発表: http://www.mysql.com/news-and-events/sun-to-acquire-mysql.html Sun側の発表: http://www.sun.com/aboutsun/media/presskits/2008-0116/index.jsp?intcmp=h... Sun CEO, Jonathan Schwartz's Blog: http://blogs.sun.com/jonathan/date/20080116 MySQLは、優れたセンスの良いエンジニアとコミュニティによって、シンプルなデザインとスピードを優先しバージョンアップを重ねてきた、GPLによりオープンソースで公開、配布されている、あらゆるOS上で動作するすばらしいリレーショナルデータベースです。スウェーデンに本社を置く400人の小さなMySQL AB(1995年創設)によって有償のサポートを続けており、その中にはオリジナルの開発者のMicheal Widenius氏も含まれています。 MySQL社は、MySQLのGPL版(Community Edition)と、コマーシャル版(Enterprise Edition)の二つのライセンスを共存させるDual Licenseでビジネスを行おうとしてきましたが、これは、開発者が内部にいるからこそできたことだと思われます。 私は、MySQLは、本当の意味でオープンな精神、今日のインターネット文化、ウェブアプリケーションの発展に貢献し、体現してきた最も優れたオープンソースソフトウェアのひとつだと信じていますし、MySQL ABは技術中心志向を失わずに、そして、オープンソースを単なる宣伝文句に使うのではなく、MySQLの発展をサポートしてきたように感じています。 今後、SunがMySQL社を買収したとしても、MySQL自身がこの状態やバランスを失わないで、より発展していってほしいと思いますし、Sunならば・・・と期待もしています。MySQL「社」、つまり、MySQLのロゴや経営権、社員、資産などはSunが引き受けますが、MySQLのソフトウェアはGPLでありコミュニティーベースのオープンな、そして、迅速な開発力を失わないまま発展していってほしいものですし、Sunはそれを経済的面、技術的面の両方でサポートし、美しい関係になっていくことを心から願います。 Enteprise Watch: 米Sun、オープンソースDBのMySQLを買収へ http://enterprise.watch.impress.co.jp/cda/foreign/2008/01/17/12031.html IT Media: Sun、MySQLを買収へ http://www.itmedia.co.jp/enterprise/articles/0801/17/news005.html CNET/Japan: サン・マイクロシステムズ、オープンソースDB企業のMySQLを取得へ http://japan.cnet.com/news/biz/story/0,2000056020,20364986,00.htm NikkeiBP: SunがMySQLを10億ドルで買収,「イルカの飛翔を手助け」 http://itpro.nikkeibp.co.jp/article/NEWS/20080117/291269/ Compuworld.jp: Sun、MySQLを総額10億ドルで買収へ http://www.computerworld.jp/news/trd/94489.html CNET/Japanの記事を読んで・・・・・ "...電話会議の席上、Schwartz氏は本買収についてSunの歴史の中で最も重要な買収と述べた。" Sunは数々の偉大な革新や戦略を見せてきた会社です。今回のMySQLの取得は、今後、どのように進んでいくかは予測困難ですが、少なくとも1990年から、Sunに触れ続けた人間として、歴史的にも大きな意味を持ち、また、商用ソフトウェアとオープンソース・ソフトウェアの関係に新しいモデルとパラダイムを提示することになると思います。 このような、関係は、GlassFishとSun、JavaとSun、NetBeansとSun、OpenSolarisとSun, OpenOfficeとSun等をみると、すこし安心できるのです。 "Schwarz氏はまた、MySQLのストレージエンジン「Falcon」をSunのSolaris OSやサーバ向けに最適化するために技術的な設計を行うとして、複数の分野を概説した。" 現在のMySQLのメインのストレージエンジンであるInnoDBのエンジニアが在籍するフィンランドの社員数5人のInnoBase社は、2005年にOracleが買収しました。内部の事情はわかりませんが、このような状態になったことを、私は非常に残念に感じていました。当然、InnoBase社が合意したから実現した買収ではあったにしてもです。 http://japan.zdnet.com/news/db/story/0,2000056180,20100827,00.htm おそらく、ある事柄を良好に維持し続けるということは、難しいことなのだと思いながら、このニュースを見ていましたが、Oracle社に対して、資本主義の原理からはフェアなのかもしれないが、このOracle社のとった選択に深い失望を感じ、元気をなくしました。 その後、Borland社のInterBaseから派生したオープンのソースのFireBirdのストレージエンジンを作ったエンジニアをMySQLに迎え独自に開発が進んでいたのがFalconですが、まだ、開発途中であり、これが安定した実装になることを私は強く望んでいます。 "しかし、本買収には困難も伴う。「SunとOracleの密接な関係や、PostgreSQLへの投資などの問題もある」とZachary氏は指摘する。" 私は、これは、それほど本質的な問題ではなく、社交辞令のように見えます。MySQLとOracle,PostgreSQLのユーザー層は今のところセグメンテーションされています。JavaDB(Derby)のサポートも表明していますが、まだ、十分な付加価値をつけられているとは思えません(つまり、コミュニティへフィードバックできるような材料が期待よりも少なめであるということ・・・)。SunのMySQL買収は、Sunにとって登るべき山をもうひとつ増やしたことになります。超えることができるのでしょうか。 遅かれ早かれ、Sunが買収しようとしまいと、OracleやPostgreSQLと、MySQLは市場のどこかで強く競合する時期が訪れるはずです。もちろん、今後どうなるかは誰にもわかりませんが、ベンダーではなく、ユーザーが選ぶというオプションが生まれます。 MySQLの扱いは、SunがAMD x64を扱い始めた時の状況に似ている気がします。OracleとPostgreSQLは非常に良く似ているように見えます。Oracleのような機能を持つオープンソースDBをほしい人がPostgreSQLを選択し、MySQLは利用者の層と志向が若干異なるように感じます。ちょっと前まで、MySQLはトランザクションさえサポートしておらず、ANSIにも準拠しておらず、そして、それを正当化できるだけの主張と個性を持っていた実装です。今は、軽量さとスピードを失わず、その両方が実装されていますから、凄いことです。 ZFSやSMF等はMySQLでどこまで使えるのでしょうか? 48個のSATAディスクで構成されるストレージプールを、MySQLが使い切ることはできるのでしょうか? MySQLのクラスタリングは構成しやすくなるのでしょうか? Sunには、イルカの軽快さ、賢明さ、そしてスピードを奪わず、その進路を照らし、助け、育むような寛大さを心から望みます。 それは、オープンソース、テクノロジーに新しい地平を提示することになるはずです。

多様性の利点とコスト,Fedora8, Epson PM-T960 #2

前のブログではタイトルから話題がそれてしまいました。

最近、久々に自宅にプリンターを購入しました。

仕事で使っているオフィス用途のプリンターと言うか、コピー、プリンター、スキャナー、ファックスが使える4in1の複合機の機能には概ね満足していて、特に、ネットワークにそれがつながり、コンピューターと連携できる点は便利だと感じながら数年使い続けています。


私たちの業務の性格上、導入の条件として、プリンターに限ったことでは無いのですが、WindowsだけでなくLinuxやSolaris等への対応がいつも気になる点です。そして、ほとんどの場合、Windows以外の対応には若干の困難が伴いますし、ハードウェアの持つ機能をフルに生かせない場合もあります。

プリンターについては詳しくないのですが、ひとまず、PostScriptエミュレーションカードを装着することで対応していますが、これは非常に高価に感じます。これで印刷するための最小限の条件が揃うのですが、プリンターの全機能を利用できるようになる訳でもありません。

さて、ホームネットワークに置けるプリンターを検討したのですが、自宅のネットワークには、Windowsあり、Linuxあり、Solarisあり、さらに、携帯電話、デジタルカメラ、PlayStation3, PlayStation Portable、Nintendo DSあり、Wiiがあり、オフィスよりもエゴイスティックでヘテロジーニアスな状況です。子供が3人もいるので・・・。さらに目的も、ビジネス文章を打ち出すだけに止まらず、写真なども打ち出したい。

で、プリンターを近くの電気屋さんに子供連れでいったので、じっくり検討する時間もなく、店員さんとちょっと話しながら15分で決めたのが Epson PM-T960 でした。ファックスが無いのが気になりましたが。

最後に自宅でプリンターを購入したのは5年ほど前だった思うのですが、制御するためのソフトウェアはWindowsから行うことになり、完全にWindowsの周辺機器といった機械でした。

しかし、今回購入したプリンターを使ってみて驚くのは、プリンター自身の独立性です。コンピューターが無くても、Windowsが無くても、実に様々なことができる。

まず、3.5インチ液晶との操作パネルを持っていて、プリンターの設定がプリンター自身で行える。外部記憶装置として、USBマスストレージや各種メモリカードを記憶装置として装着でき、写真のプレビューできる。かつ、ネットワークでWindowsのファイルサーバー(SMB/CIFS?)にもなり共有が可能である。USB接続とIrDAによる赤外線通信ができ、携帯電話やデジタルカメラともPictBridgeでやりとりできるようになっている。ネットワークは無線とEtherが使える。また、スキャンしたデータはビットマップの他にPDFで保存しておくこともできる。

入出力装置を持ち、二次記憶装置を持ち、ネットワークを持っていて・・・もし、これでプログラミング可能であれば、まるで独立したコンピューターのように見えるのです。もやは、周辺機器では無い。

問題は価格なのですが、一般の家庭や個人でも入手できるくらいまで下がってきています。

ネットワーク接続し、色々、試してみました。

Windowsでは、まず何事も問題なくカタログどおり動作するでしょうから、あまり試すことがありません。

Linux(Fedora 8)

簡単な基本設定やインクの残量などがブラウザで確認できます。
また、写真などは、inux側でUSBメモリや各種メモリカードに保存して、プリンターのスロットにさせば読んでくれるので、最悪、オフラインでデータを持ち運びできる。

Linux用のプリンタードライバーは、Epsonのサポートページからリンクされているエプソンアヴァシス株式会社で提供しているようです。

http://avasys.jp/linux

動作確認状況を見るとFedora Core6まででFedora8は掲載されていませんでしたが、トライしてみました。rpmでインストールした所、いくつかの依存性のチェックでライブラリが不足していましたが、追加してひとまずインストールは完了しました。

その後、CUPSあるいはSystem-Config-Printerでネットワークプリンターとして設定を追加し、テストした所、テストプリントには成功しました。

OpenOfficeからの打ち出しはどうでしょうか。Fedora8にはOpenOffice2.3が含まれています。私の設定では両面印刷、出力先のトレイ、用紙の種類、用紙のソースなどが選べませんでしたが、図入りのドキュメントは綺麗に印刷できました。

続いて、プリンターの持つ、ファイル共有機能をテストしました。
プリンターのスロットにメモリカード(SDカード)を差し込んで、それをLinuxから読み書きできるかどうかです。

# smbclient -L //epsonpm
Password: 
Domain=[WORKGROUP] OS=[EPSON] Server=[EPSON]

        Sharename       Type      Comment
        ---------       ----      -------
        MEMORYCARD   Disk      EPSON
        IPC$            IPC       Remote Inter Process Communication
エラーはでるのですが、見えてはいるようですので、接続してみます。
# smbclient //EPSONPM/MEMORYCARD
Password: 
Domain=[WORKGROUP] OS=[EPSON] Server=[EPSON]
smb: \> ls
ERRSRV - ERRaccess (The requester does not have  the  necessary  access  rights  within  the specified  context for the requested function. The context is defined by the TID or the UID.) listing \*

                61140 blocks of size 32768. 61121 blocks available
smb: \> 
・・・ということで、残念ながら、見ることができませんでした。 合わせて、mount.cifsで試してみますが、mountはできるのですが、ファイルにアクセスできません。
# mount -t cifs -o guest,rw //EPSONPM/MEMORYCARD /mnt

# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/sdc3             106G   89G   11G  90% /
/dev/sdc1             190M   18M  164M  10% /boot
tmpfs                 760M  292K  759M   1% /dev/shm
//EPSONPM/MEMORYCARD  1.9G  596K  1.9G   1% /mnt

# ls /mnt
ls: reading directory /mnt: 入力/出力エラーです
Fedora8のSMB/CIFSの実装と、プリンター側のファイルサーバーの実装の問題がありそうです。 残念ですが、ペンディングです。ひとまず、メモリカードを経由してのやりとりとなりそうです。

PlayStation3

うまくいきました。カタログにもPlayStation3と表記されていて、簡単な設定で写真をダイレクトに印刷できるようになります。

PlayStation Portable / Nintendo DS / Wii

まだ試していません。子供と一緒に調べてみたいと思います。(ペンディング) 更新(2008/01/27): PSP-2000には、特に印刷に特化した機能はないようです。USBマスストレージ経由やMemory Stick経由になりそうです。 Ninendo Wii: プリンターとの直接接続機能はできないようです。 Nintendo DS: 父:「DSで印刷機能ある?」 娘:「多分無理・・・って言うか、データ自体持てない」

携帯電話

PictBridge対応の携帯電話をUSB接続すると、携帯電話からプリントアウトできました。また、microSDをUSBマスストレージとしても使えました。LinuxでもマウントOKです。テストしたのは、N905imという機種です。充電もできるUSBケーブルは別途購入する必要があります。

デジタルカメラ

まだ試していませんが、おそらくUSB接続のPictBridgeで印刷できると思われます。(ペンディング) 実に様々な機器が接続できるようになってきていますし、個々の機器が高度になってきています。 Linux(Fedora8)との接続は、うまく行かないことが多かったので、もうちょっと調べてみる必要はありそうです。Linuxが登場してずいぶんたち、プリンターとの接続というテーマも新しいものではありません。だんだん良くはなってきているのですが、まだまだ、うまく行かないことがあるのは残念です。 プリンターに限らず、ほとんど全ての周辺機器に関して、WindowsとMacOSに関してはハードウェアを提供するメーカーによって動作が保証され動作しますが、Linuxは簡単にはいきません。 Windowsでできればそれで良いのではないか? と考えることもできるのですが、LinuxにはWindowsにない利点がたくさんあります。その利点を私は無視することはできません。 また、さらに進化し革新的な事柄が起きる可能性を秘めています。まだ、開花しているとは思えません。Linuxはある一つのメーカーが未来を決定するというOSではありません。方向性は不安定ですし、どこに行くのか分かりません。WWWのような画期的なテクノロジーや、インターネット、TCP/IPのような仕組みは、ある一つの企業がビジネス目的で計画して発生したものではありません。この様な発明や革新が起こる可能性がLinuxには潜んでいます。 多様性に対するコストとは、将来性に対するコストと言い換えることができます。また、多様性の利点とは言うまでもなく、様々な選択や自由な発想を許すということです。もし、この可能性が失われたら、私は、テクノロジーに対する興味も完全になくなるでしょう。 デスクトップとしてのLinuxは様々な理由で、まだ不完全です。コンピューターを構成するデバイスもWindowsにはきちんと対応しLinuxへの対応をほとんどのメーカーはしていません。それは、Linuxを完全に把握し、それとの互換性をサポートしたりコントロールしている強力な中心点が存在しないからでしょう。Linuxには非常に多くのディストリビューションが存在します。 そして、そのような中心点がないことが、逆に利点ともなっていると思うのですが、これはジレンマです。ジレンマを抱えながらも、今日まで何とか進化してきているのは、パワフルでありタフだと感じています。 Windows以外に自由に様々なOSが選択できるような状況、これには、たくさんの人たちの参加や努力が必要になる、長い長い道程なのでしょう。それは、案外、プロトコルやオープンな仕様が策定されることで急速に進む可能性があります。 可能性や将来性を一つに限定することは、非常に危険なことです。 優れた考えを持つ人たちは、ある一つの組織だけでなく、世界中に存在するはず。そして、それらが連携しあうことを想像するのは生きる元気になるのです。

一期一会

私は職業を、「コンピューターソフトウェア関連のインストラクター」としています。
扱う分野やテクノロジーは様々ですが、実にこの職業を続けて16年目になります。

私に、この職業の適正があるかどうかはわかりませんが、「優れたテクノロジーを多くの人に伝え、理解してもらう」ということを念頭に続けてきました。これを実践するためには、「何が優れているのか?」ということ規定しなくてはいけませんし、また、対象がテクノロジーなので、当然、複雑な技術を内面的に理解していなくては説明できませんし、そのために、それのソフトウェアを作った人の意匠の理解も必要なります。また、理解しやすく内容を整理しストーリーを考えたり、印象に残してもらうような戦略も必要になってきて簡単ではありません。当然、正確さや明確であることも要求されます。

人の前で説明するこの職業は、ソフトウェアの開発や執筆などと違い、その活動は記録されません。
ですから、映画と演劇の対比にたとえれば、活動は、演劇やライブと近いものがあり、なんというか、肉体労働的な面があり、トレーニングを実施した後は、年齢を重ねるごとに、つらさを感じるときもあります。

私は、坂本龍一の熱狂的なファンではありませんが、先日のブログで"bibo no aozora"を弾いている彼の姿をみて、「音楽家」というものが何であるかをぼんやりイメージできると書きました。なぜ、いまさらながら、そのような感想を持ったのか・・・

それは、CDやDVDで、音楽を聴くだけでなく、Youtubeで演奏する姿が移っている映像や、様々なバリエーションをみて、そう感じた理由がわかった気がします。彼は、CDを一回作ってそれで終わり・・・というわけではなく、その曲を何度も何度も、弾き続けていて、そのたびごとに異なるアレンジや感情を込めていて、同じ曲だけれども、そのときそのときに弾き方が違っています。

CDで販売するというだけでなく、楽器を演奏する・・・ということを続けているのだなと感じたからこそ、単なる、タレントではなく、「音楽家」と感じたのだと思います。

youtubeで、「坂本龍一 戦場のメリークリスマス」で検索すると、様々な姿、年代、場所、番組で演奏された映像を見ることができます。シンプルなピアノだけの演奏なので、余計、違いがわかります。

youtubeの記録された映像をみつつこう感じるのは逆説的な気がしますが、数々の彼の演奏をみて、ライブで演奏される曲は、その場限りのもの・・・なわけですが、再現されないようなその時だけの現象、つまり、「生」「ライブ」というのは、刹那的ではあるけれども、とても強いものだと再認識させられます。・・・という認識も、記録されているからこそではあるのですが・・・・ もちろん、自分と彼を比較するつもりは毛頭ありません。ただ、ライブの価値を再認識する必要があると感じたのです。 そして・・・テレビや映画、CDやDVD、コンピューターなどの人工的な経験よりも、今、現実で、目の前で起きている現実をもっとちゃんと見るべきなのだ・・・と感じてます。 今日は、友人の結婚式に招待してもらっています。ちゃんと、見てこようと思います。

Book: Java Quick Start

Javaの開発を行うためのクイックスタートシリーズ。
(作成中)

NetBeansのインストール

NetBeans( Web & Java EE )をダウンロードします。

http://download.netbeans.org/netbeans/6.0/final/

インストーラーの起動:

# sh ./netbeans-6.0-javaee-linux.sh 
デフォルトでインストールした場合のパラメーター (Fedora8/Linux) IDE Install Directory: /usr/local/netbeans-6.0 IDE JDK: /usr/java/latest GlassFish Install Directory: /usr//usr/local GlassFish JDK: /usr/java/latest GlassFish Admin Username: admin GlassFish Admin Password: adminadmin GlassFish HTTP Port: 8080 GlassFish HTTPS Port: 8181 GlassFish Admin Port: 4848 Tomcat Install Directory: /usr/local/apache-tomcat-6.0.14 インストール後、NetBeansの起動:
# /usr/local/netbeans-6.0/bin/netbeans

Folding@Home, Team "106692" "Knowledge Desing Corporation"

Team "106692" "Knowledge Desing Corporation"で、Folding@Homeに参加しました。2008年1月現在、Solaris版のプログラムが配布されていないのが残念。(Stanford大なのに・・・)
追記(2007/1/30):Solaris BrandZを使用すればSolarisでもOKであることを確認しました。
追記(2007/2/5):Solaris BrandZ(CentOS3)上で実行されたFolding@Homeのアプリケーションは、ユニット計算後、データの送信がうまくいかないようです。

Knowledge Design Corpration Team Statistics Page (Stanford Univ.):
http://fah-web.stanford.edu/cgi-bin/main.py?qtype=teampage&teamnum=10669...

Wikipedia Folding@Home project:
http://ja.wikipedia.org/wiki/Folding%40home

Participant Machines
2008/1/28:
#1, Intel Pentium4 3.2GHz 2 core, Linux 2.6 (Ubuntu), install
#2, Intel Celeron 2.6GHz, Linux 2.6 (Fedora8), fr
#3, Intel Celeron 2.5GHz, Linux 2.6 x64 (Fedora Core 4), www2
#4, Intel Celeron 2.6GHz, Linux 2.6 (Fedora Core 5 ), gw
#5, Intel Celeron 2.4GHz, Linux 2.6 (Fedora8), www1
#6, Cell, PS3, home
2008/1/30:
#7, Intel Pentium4 2.8GHz, Win2K, banana
#8, Intel Celeron 2.4GGHz, Win2K, vueserver
#9, AMD Opteron 148 2.2GHz, WinXP, mag
#10, AMD Opteron 152 2.6GHz, Solaris BrandZed CentOS3, opteron1
#11, AMD Opteron 148 2.2GHz, Solaris BrandZed CentOS3, id-z1
#12, AMD Opteron 1210 1.8GHz 2 Core, Solaris BrandZed CentOS3, sherry4-z1
#10, AMD Athron64 x2 3800+, Fedora8, ichiki-desktop
#11, Cell, PS3, home_ichiki

lightning 0.7 with ThunderBird 2.0.x

ThunderBridのカレンダー・アドオン、lightningはなかなか小気味よく動いています。
2008年1月現在、0.7がリリースされています。アドオンではなく、単体のアプリケーションとして使用したい場合は、SunBirdがリリースされています。いずれも、日本語版はありません。

http://www.mozilla.org/projects/calendar/lightning/download.html
http://www.mozilla.org/projects/calendar/

月別、週別、日別に表示でき、とても見やすく、複数のカレンダーを、ビューに追加し、必要に応じて表示したり消したりできます。

追加できるカレンダーは、自分で作成するローカルなカレンダーと、ics形式のファイル、CalDAV形式がサポートされています。加えて、Sun Java System Calendar Serverなどで使用できるWCAP形式をサポートするバージョンも用意されています。

ics形式、CalDAV形式、WCAP形式はネットワーク上で共有可能なため、複数人がスケジュールを読んだり、編集したりすることも可能です。

例えば、Mozilla Calendarプロジェクトでは、ics形式の日本の祝祭日のカレンダーを公開しています。ダウンロードしてそのファイルを追加する方法もあるのですが、ダイレクトにURLを指定しても正しく動きます。
http://www.mozilla-japan.org/projects/calendar/holidays.html

カレンダーを追加する際、以下のURLを指定します。

http://www.mozilla.org/projects/calendar/caldata/JapanHolidays.ics

カレンダーに、祝日が表示されるようになります。

上記のサイトのURLは読み込みしかできませんが、指定したURLがWebDAVなどで読み書き可能な状態であれば、編集も出きるようです。残念ながら、私のWebDAVサーバーとの検証では、読み込みしかできませんでした。

また、CalDAV、WCAPを使用して、読み書き共有することもできるようです。

社内のスケジュールを、Google Calendarで管理するのは、セキュリティ的に若干不安です・・・。

Linux run on Solaris BrandZ

現在、Solarisがインストールされているマシンがたくさんあるのですが、Linuxのアプリケーションも使用してみたくなることがあります。

OpenSolarisのプロジェクトである、BrandZを使用した時のメモです。

OpenSolaris Community: BrandZ:
http://opensolaris.org/os/community/brandz/

使用したSolarisのリリースは以下の通りです。

# cat /etc/release
                        Solaris 10 8/07 s10x_u4wos_12b X86
           Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
                        Use is subject to license terms.
                            Assembled 16 August 2007
Solaris 6/06では、以下のエラーがでます。パッケージの追加が必要なのかもしれません。
# cat /etc/release
                        Solaris 10 6/06 s10x_u2wos_09a X86
           Copyright 2006 Sun Microsystems, Inc.  All Rights Reserved.
                        Use is subject to license terms.
                             Assembled 09 June 2006
# zonecfg -z zwing-z1
zwing-z1: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:zwing-z1> create -t SUNWlx
SUNWlx: No such zone configured
事前準備: 1) BrandZ用に、ネットワーク上のIPアドレスと、OS上でのファイルシステムを計画しておきます。 例) IP Address: 172.16.0.XX ZonePath: /zones/id-z1-root 2) インストールするLinuxのインストールイメージ(DVDやCD, iso, tar等)を用意します。 現在はまだRedHat EL 3とCentOS 3がサポートされているようで、それ以降のものはテスト段階のようです。 CentOSのイメージ(CentOS 3.7でした)が、以下で配布されているので利用させてもらいます。 OpenSolaris.org CentOS tarball for easy installation: http://dlc.sun.com/osol/brandz/downloads/centos_fs_image.tar.bz2 上記をダウンロードし、解凍します。
# bunzip2 centos_fs_image.tar.bz2
... 3) Solaris上で、Linux用のZone( lx branded zone) の構成をおこないます。 http://opensolaris.org/os/community/brandz/install/ zonecfgコマンドを利用して構成していきます。 対話的な設定もできますし、ファイルに記述しておいても実行できます。
# cat id-z1.cfg
create -t SUNWlx
set zonepath=/zones/id-z1-root

add net
set address=172.16.0.XX/16
set physical=nge0
end

commit
exit


# zonecfg -z id-z1 -f id-z1.cfg
#
# zoneadm list -vc
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              native   shared
   - id-z1            configured /zones/id-z1-root              lx       shared
4) lx ZoneにダウンロードしてきたLinuxのイメージを使ってインストールします。
# zoneadm -z id-z1 install -d /centos_fs_image.tar
Installing zone 'id-z1' at root directory '/zones/id-z1-root'
from archive '/centos_fs_image.tar'

This process may take several minutes. ・・・ゆっくりとお茶が飲める程度(6〜7分)時間がかかりました。

Setting up the initial lx brand environment.
System configuration modifications complete.
Setting up the initial lx brand environment.
System configuration modifications complete.

Installation of zone 'id-z1' completed successfully.

Details saved to log file:
    "/zones/id-z1-root/root/var/log/id-z1.install.1864.log"

# zoneadm list -vc
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              native   shared
   - id-z1            installed  /zones/id-z1-root              lx       shared

5) lx Zoneの起動。
# zoneadm -z id-z1 boot

# zoneadm list -vc
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              native   shared
   1 id-z1            running    /zones/id-z1-root              lx       shared
b
6) コンソールからのログインと、初期環境設定
# zlogin id-z1
[Connected to zone 'id-z1' pts/3]
Welcome to your shiny new Linux zone.
        - The root password is 'root'.  Please change it immediately.
        - To enable networking goodness, see /etc/sysconfig/network.example.
        - This message is in /etc/motd.  Feel free to change it.
For anything more complicated, see:
        http://opensolaris.org/os/community/brandz/

-bash-2.05b# cat /etc/redhat-release ・・・リリースの確認
CentOS release 3.7 (Final)

-bash-2.05b# passwd ・・・rootのパスワードの設定
...

-bash-2.05b# vi /etc/sysconfig/network ・・・ホスト名、ネットワーク起動の設定
HOSTNAME="id-z1"
NETWORKING="yes"

-bash-2.05b# vi /etc/resolv.conf ・・・DNSの設定
domain office.knowd.co.jp
nameserver 172.16.0.xxx

-bash-2.05b# exit
[Connection to zone 'id-z1' pts/3 closed]
# 
・・・念のためグローバルゾーンから再起動。
# zoneadm -z id-z1 reboot
7) テスト 他のマシンからアクセスできることを確認します。
# ssh id-z1
root@id-z1 のパスワード:xxx

-bash-2.05b# ps -e ・・・起動してるプロセスの確認 (以下は全プロセス)
  PID TTY          TIME CMD
 3100 ?        00:00:00 lx_thunk
 3367 ?        00:00:00 bash
 3063 ?        00:00:00 syslogd
    1 ?        00:00:00 init
 3067 ?        00:00:00 klogd
 3079 ?        00:00:00 portmap
 3099 ?        00:00:00 lockd
 3108 ?        00:00:00 lx_thunk
 3222 ?        00:00:00 sshd
 3325 ?        00:00:00 mingetty
 3326 ?        00:00:00 sshd
 3107 ?        00:00:00 statd
 3271 ?        00:00:00 crond
 3252 ?        00:00:00 sendmail.sendma
 3260 ?        00:00:00 sendmail.sendma
 3233 ?        00:00:00 xinetd
 3305 ?        00:00:00 atd
 3329 ?        00:00:00 login
 3295 ?        00:00:00 xfs
 3332 ?        00:00:00 bash
 3402 ?        00:00:00 ps

-bash-2.05b# yum check-update ・・・yumが使用できることを確認 (オプション。かなりの数のパッケージがアップデート対象となる)
Gathering header information file(s) from server(s)
Server: CentOS-3 - Addons
Server: CentOS-3 - Base
Server: CentOS-3 - Extras
Server: CentOS-3 - Updates
Finding updated packages
Downloading needed headers
emacs-0-21.3-4.10.i386.hd 100% |=========================|  49 kB    00:01
...
ypbind                              i386   3:1.12-5.21.10           base
yum                                 noarch 2.0.8-2.centos3          base
zlib                                i386   1.1.4-10.EL3             base
-bash-2.05b# 

-bash-2.05b#  yum update ・・・アップデートの実施(オプション)
Gathering header information file(s) from server(s)
...
Transaction(s) Complete
-bash-2.05b# reboot


  

LightningとGoogle Calendarの連携

ThunderBird 2.x + Lightningでカレンダリングできることを前回のブログで書きました。これで、iCal、CalDAV、およびWCAPに対応できるようになります。CalDAVサーバーの設定方法に関しては、鈴木さんのブログにまとめられていますので、参考になります。

さて、Lightningと、Google Calendarの連携が可能なアドオンを見つけましたので紹介します。

Provider for Google Calendarを、LightningがアドオンされているThunderbirdに追加しておきます。

Google Calendarにアクセスします。

左下のカレンダーリストの"Manage Calendars"をクリックします。

Lightningと連携したいカレンダー名をクリックします。カレンダーの各種設定が表示されますので、一番下の"Private Address:"の"[XML]"ボタンをクリックすると、そのカレンダーにアクセスするためのURLが表示されますので、それをクリップボードにコピーしておきます。

Lightningに戻り、Google Calendarを登録するために、新しいカレンダーを作成します。

"Prodivder for Google Calendar"プラグインが追加されていると、iCalendar, CalDAVに加え、Google Calendarが選択できるようになっていますので、先ほどクリップボードにコピーしたGoogle CalendarのURLをペーストします。

任意の名前と色を設定します。

この時点でGoogle Calendarにアクセスするようです。Googleアカウントを入力します。

以上で、LigthningのカレンダーとGoogle Calendarの連携が完了します。

テストとして、まず、Lightningにスケジュールを登録してみます。

Google Calendarで表示されることを確認します。

次に、逆に、Google Calendarにスケジュールを登録し、Lightningで表示されることを確認します。

Lightning側でリロードし、表示を確認します。

なんと、素晴らしい世界なのだろうか!

ただ、これが役に立つ状況はどんなときなのだろうか・・・と、ちょっと考えてみると、結構、根が深いと思っています。なぜ、Google CalendarとLightningを連携させなければいけないかと考えると、それは、スケジュールデータがGoogleとローカルなPCと会社のサーバーに分散するからです。

分散はコストがかかるので、Google Calendarだけに集約しようとすると、次の点が気になり始めるはずです。

1. Googleは私のプライバシーを守ってくれるのだろうか?
2. Googleは永遠に続くのだろうか? サービスが停止したら、私のデータは?
3. 会社のスケジュール、例えば、「来週、得意先のだれだれ様と、何々の案件についてミーティング、場所はどこどこ、緊急の際の携帯電話の番号は何番。」というような情報を、Googleのようなインターネット上のサイトに置いてよいのだろうか? 常識的にはだめだ。

ということで、Googleは非常に便利なのですが、企業で使うには、プライバシーやセキュリティ、コンプライアンス、データ管理の責任所在の点で、いくつかの問題がでてきます。カレンダーだけの問題ではなくメール、あるいはdocs.google.comなどもそうですが、このような観点からサーバーを閉じられた企業内ネットワークに設定する必要がでてくるのでしょう。

あるいは、Googleが特定企業と契約してASPのようなサービスを提供するということはありうるのでしょうか・・・。私は、Googleのビジネスの現状を知りませんが、私の個人的な推測では、現状、その判断をGoogleはしないように思います。GoogleはNetizen側を向いているように思います。

では、どのようなときに、あるいは、どのような類のデータをGoogle Calendarに置くことができるかというと、個人の趣味であるとか、サークル、コミュニティなどでは便利でしょう。

とはいえ、Google Calendarのインターフェイスは、非常に素晴らしい出来栄えです。

サーチエンジンはアプライアンスとしてリリースされていますから、Google Mail ServerやGoogle Calendar Server、Google Analyze Serverのようなサーバーソフトウェアを提供する日が、いつかくるかもしれません。

・・・というか、もうしているのだろうか・・・

たとえテクノロジーが進化したとしても…

中学生の頃、両親に購入してもらい、初めて所有したパソコンが、NEC PC-8801 MkII SR model 30 です。

ほとんどゲームばっかりやっていましたが、N88 BASIC というプログラミング言語でプログラムを試し始めたのはこの頃からです。このコンピューターには、熱中しましたし、とても、幸せな時期だったとノスタルジーに浸ることもできます。

1985年、昭和60年、発売とのことですから、20年以上前のことになります。

様々なパソコン雑誌やプログラミング雑誌が、私の暮らしていた田舎でも購入することができ、それを読むのですが、BASICについては何となく分かったものの、アセンブラやハードウェアに関しては、中学生の私には理解は困難でした。

私の心をとらえたような作品やゲームを作るには、そういったことを理解する必要があることはぼんやり分かっていましたが、やはり、職人の作るものだ・・・簡単なものではないということは、理解していました。

技術的な能力に加え、音楽やグラフィックス、物語やシナリオを作る能力、またそれらをプロデュースする能力など、非常に多彩な能力が必要何だろうな・・・とぼんやり考えていました。

現在、プログラマーという職業を選択していないのは、この時のそういった感覚、つまり、プログラムを作ることの難しさをある程度理解していたからだと思います。

さて、20年以上経て、当時に比べ、コンピューターの性能は驚くほど上がっています。

まったく根拠もなく、きっと、昔、やろうとしていたことが、今はもっと簡単にできるのではないか? などと思い、昔、中学生の私がPC-8801で練習していたようなプログラムをJavaで再現してみようと考えました。

現在、私が作るプログラムのほとんどはWebアプリケーションなのですが、作ろうとしたのは、昔作っていたような・・・まぁ、他愛もない、線や円のグラフィックスを描画する・・・と言ったことをJavaのAWTやSwingの本当に基本的な機能を使って作ろうと考えました。

・・・で、できたのが、次のようなプログラムです。動きもしませんし、対話的でもありません。単に、表示するだけです。

簡単に作れると思ったのですが・・・

当時、中学生の私が、N88 BASICのマニュアルを引きつつ作った時よりも、おそらく、時間がかかってしまいました。

・・・なんということだ・・・・

インターネットで世界中の情報が入手でき、コンピューターの性能が何千倍になったとしても、私の能力が上がったわけではないことがよく分かりました。

ややもすると、コンピューターの性能の向上が、自分の能力を上げているのではないか? と錯覚しそうになるのですが、まったくそんなことはない。世の中が進んだとしても、ちょっとづつでも能力を獲得していくしかないんだと・・・なぜか、とても、すっきりした気持ちです。

OmegaT - translation memory tool.

OmegaTについて

OmegaTはJavaで作られたフリーの翻訳メモリアプリケーションです。このツールは翻訳の専門家を対象としています。翻訳はしません。(それを行う「機械翻訳」ソフトは、自分自身でどこかから探してこなければなりません。) OmegaTは次のような特徴を持っています。

  • ファジーマッチング
  • マッチプロパゲーション
  • 複数ファイルを含むプロジェクトの同時処理
  • 複数訳文メモリの同時使用
  • 外部の語彙ファイル
  • ドキュメントファイルフォーマット:
    • XHTML と HTML
    • Microsoft Office 2007 XML
    • OpenOffice.org / StartOffice
    • XLIFF (Okapi)
    • MediaWiki (Wikipedia
    • プレーンテキスト
  • Unicode(UTF-8)のサポート: 非ラテンアルファベット使用可能
  • 左側から記述される言語のサポート
  • 他の訳文メモリアプリケーション(TMX)との互換性

OmegaT英語版のトップページより: http://www.omegat.org/en/omegat.html
原文: /yamazaki/files/omegat-intro.txt

・・・と、OmegaTのサイトのトップページを自分なりに訳してみました。ウェブを検索すると"Translation Memory"は「翻訳メモリ」と訳しているのが多かったのですが、「翻訳」は動詞でもあり、あたかも「翻訳してくれる」ようなニュアンスを感じました。通訳されたものを記録しておくだけなので、「訳文メモリ」のほうが実体に近い表現かもしれません。

まず、OmegaTをダウンロードし、インストールします。

現時点で、1.6が安定版で開発版は1.7です。

Linux, MacOSX, Windows版のビルドが公開されていますが、合わせてソースも存在します。

OmegaT ダウンロード(SourceForge): http://sourceforge.net/project/showfiles.php?group_id=68187&package_id=2...

Javaなので、ソースからビルドしてみます。

OmegaT 1.7.3 source Download: http://downloads.sourceforge.net/omegat/OmegaT_1.7.3_Source.zip?modtime=...

# ls
OmegaT_1.7.3_Source.zip

# mkdir omegat 
# cd omegat/
# unzip ../OmegaT_1.7.3_Source.zip 
Archive:  ../OmegaT_1.7.3_Source.zip
   creating: addons/
...
  inflating: test/org/omegat/util/StaticUtilsTest.java  

# ls
addons  build.xml  docs  images  lib  lib-mnemonics  manifest-template.mf  nbproject  release  src  test

# ant
Buildfile: build.xml

...途中、警告がでるが...

BUILD SUCCESSFUL
Total time: 12 seconds


# cd dist
# sh OmegaT
OmegaTが起動します。 左側のペインにガイドが表示されます。

OmegaT: プロジェクトの作成

作業するためのプロジェクトディレクトリを作成します。
手順は、OmegaTを起動した画面の「お手軽スタートガイド - 2. OmegaTで、どのように翻訳するか」に詳しく書かれています。

指定したディレクトリ以下に、デフォルトで・・・

原文 - source
参考翻訳(TMX) - tm
用語集 - glossary
訳文 - target

と言う4つのディレクトリが作成されます。
加えて、その設定を行っている、omegat.project というファイルが作成されます。

プロジェクト - 原文ファイルの追加 から、翻訳対象のファイルを指定します。
このファイルは、sourceディレクトリにコピーされます。

ここでは、サンプルとして以下のGPLv2の原文を対象とします。
gpl-2.0.txt

これを、分節毎に翻訳していきます。

サンプルとして、八田さんの翻訳を使わせていただきます。<分節 xxxxx>ではさまれた部分が翻訳者が入力する部分です。

...
The licenses for most software are designed to take away your freedom to share and change it.
<分節 0005> ソフトウェア向けライセンスの大半は、あなたがそのソフトウェアを共有したり変更したりする自由を奪うように設計されています。 </分節>

By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
<分節 0006> 対照的に、GNU 一般公衆利用許諾契約書は、あなたがフリーソフトウェアを共有したり変更したりする自由を保証する--すなわち、ソフトウェアがそのユーザすべてにとってフリーであることを保証することを目的としています。 </分節>
...

一回目の翻訳は、翻訳メモリが空ですので、効果はありません。

プロジェクト - 訳文ファイル生成 を選択すると、<訳文>タグで囲まれた翻訳された部分のみが、targetディレクトリに保存されると同時に、プロジェクトディレクトリに以下のファイルが生成されます。

project-name-omegat.tmx (tmx11.dtd, tmx version="1.1")
project-name-level1.tmx (tmx11.dtd, tmx version="1.1")
project-name-level2.tmx (tmx14.dtd, tmx version="1.4")

という3つのファイルが生成されます。
このファイルに、訳文がXMLで保存されます。これが、次回の翻訳に再利用できる素材となります。

続いて、類似する原文をプロジェクトに追加で読み込みます。
gpl-3.0.txt

いくつかの類似する文節が存在します。

v2
The licenses for most software are designed to take away your freedom to share and change it.

v3
The licenses for most software and other practical works are designed to take away your freedom to share and change the works.

以前翻訳した、v2と対象の分節を比較し、参考訳文のペインに類似率と差分の箇所を色付けし指示してくれます。

翻訳者は、もしこれを適応したければ、[CTRL] + R を押すと分節をその文に置き換えてくれます。後は、変更箇所を検討し日本語をなおします。

類似する文節が多い場合に効果がありそうです。また、ドキュメントがバージョンアップされることを考えると、v1の翻訳メモリはv2で効果を発揮しそうです。

OmegaT: 翻訳メモリの追加と共有

翻訳を続けていくと、成果物として、訳文とともにTMXファイルが作成されます。

GPLv2 + GPLv2 八田氏翻訳TMX
omegat TMX
level1 TMX
level2 TMX

このTMXファイルを、tmディレクトリにコピーして利用できますので、他のプロジェクトでも流用できます。

OmegaTでフォーカスを分節に合わせると、TMXファイルから検索された結果が「参考訳文」として右上の選択項目に類似分節として選択可能な状態になります。もし、tmディレクトリにコピーしたファイルであれば、対象のTMXファイル名が候補の下にでてきます。そこで、候補を[CTRL] + [N] で選択したのち、 [CTRL] + R で置き換え可能です。

加えて、もし、対象原文とTMX内の分節の一致率が特定のパーセンテージを越えた場合、自動的に置き換えを行ってくれるように設定することも可能です。

設定 - 翻訳入力行...

自動的に置き換えられたことを示すためのプレフィックスも指定できます。デフォルトでは[参考]という文字列がマークされます。この文字列は、まったくのブランクにすることはできないようです。スペースを一つ入れておくことはできました。

OmegaTで生成されるTMXは、単純に文章の対訳データです。

<body>
    <tu>
      <tuv xml:lang="EN-US">
        <seg>The licenses for most software are designed to take away your freedom to share and change it.</seg>
      </tuv>
      <tuv xml:lang="JA">
        <seg>ソフトウェア向けライセンスの大半は、あなたがそのソフトウェアを共有>したり変更したりする自由を奪うように設計されています。</seg>
      </tuv>
    </tu>
</body>
このデータは非常に再利用性が高いもので、良質な訳文は価値が高いはずです。 さて、複数人で翻訳作業を行う場合、このTMXファイルをみんなでうまく使うためにはどうしたら良いでしょうか? これは、OmegaTとは本質的に無関係の作業分担とチーム開発の際のノウハウについての検討となります。 翻訳する対象となるドキュメント群と、作業者を次のように仮定します。 3つのドキュメントを3人の翻訳者で翻訳します。3つのドキュメントは類似した文節が比較的多くみられると仮定します。もし、類似文節がまったく存在しないと仮定すれば、そもそも翻訳メモリの効果は期待できません。 Document-A 10module Document-B 10module Document-C 10module Translator-A Translator-B Translator-C 作業の流れを検討してみます。 単純に、Document-AをTranslator-Aが、BをBが、CをCが担当し、同時に作業したのでは、TMXファイルが共有されないので、3人の作業の相乗効果が得られません。 TMXが3人の間で共有できれば、作業効率は上がります。ですから、TMXをネットワーク上で共有し、ある作業者(A)が作業を終えたらネットワーク上にアップロードします。 次の作業者(B)は、共有されているTMXファイルを自分のtmディレクトリにコピーし作業にあたります。作業者Bが作業を終えたら自分の生成したTMXファイルをネットワーク上にアップロードします。この時点で、作業者Aと作業者Bが生成したTMX-AとTMX-Bがネットワーク上に存在することになります。 さらに作業者(C)は、TMX-AとTMX-Bを元にTMX-Cをネットワーク上に公開します。ネットワーク上のTMXは常に更新される状態になりますので、作業を行うまえに最新のTMXをダウンロードして作業を行います。 3人が作業を同時進行している場合、それらの状態を完全に同期する方法はおそらく無いでしょう。 例えば、作業者Aが分節Aを翻訳し、それをバージョン1としてアップロードし、作業者Bは分節Aを再利用します。つまり、作業者Bは分節Aの派生物バージョン1.1を作ったことになります。その後、作業者Aが分節Aを検討し直し、誤字があったので変更しバージョン2をネットワーク上にアップロードします。しかし、作業者Bは既に分節Aを再利用済みで、それは自動的には更新されません。作業者Bは作業を始める前に分節Aのバージョン2を手に入れますが、自分が訳したものは1.1のままです。OmegaT分節Aがフォーカスされたときに候補として、以前v1だったものがv2として表示されますが、v1とv2の違いは人間が目でみて察知するしかありません。 または、作業者Bがバージョン1を再利用する時に、誤字に気がつき訂正されたものにするかもしれません。すると、1.1と2でどちらを採用すれば良いか迷うことになります。 いずれにしても、この種のバージョンが入り乱れる事態は、最終的に「校正者」が適切に「判断」し、最終版に仕上げる必要があるでしょう。 これは、OmegaTの問題ではなく、ファイルのバージョン管理をどのように行うかという問題にしたいと思います。

WebSVN


Subversionをウェブからブラウズするwebsvnプロジェクトをのぞいて見たところ、新しいバージョニングで更新が続いていました。

http://websvn.tigris.org/

SVNでチェックアウトし、インストールして見たところ、デザインが良くなっていて、また、前のバージョンで気になっていた日本語も綺麗にでました。

calmスタイル

BlueGreyスタイル

OmegaT: - ODFドキュメント

OmegaTでは、テキストファイルのほかに、ODF(OpenOffice/StarSuite/StarOffice)やMS Office XMLをソースとして読み込め、また、ターゲットとして出力することもできます。

GPLv3は、HTML, Text, LaTeXとともに、ODFでも公開されています。

http://www.gnu.org/licenses/licenses.html#GPL
http://www.gnu.org/licenses/gpl.odt

ODFファイルは、OmegaTで直接読み込むことができます。

ここで、テキストと同様に参考訳文を取り入れたりしながら翻訳を続け最後に、プロジェクト - 訳文ファイル生成 を選択すると、翻訳されたODFファイルがtargetディレクトリに出力されます。

翻訳対象ドキュメントの文章だけが抽出されるので、レイアウトにとらわれることなく翻訳に集中できそうです。上記のGPLのドキュメントはあまり装飾されていないシンプルなレイアウトのドキュメントなので大きな問題はおきず、OmegaTで処理できましたが、表やグラフィックス等の複雑なドキュメントが適切に処理できるかどうかはテストしていません。

また、上記のGPLドキュメントで、ところどころに予期しない「改行」が含まれています。改行は文節の区切りとして処理されるので、文節の塊が壊れます。

この場合は、原文の改行を訂正した後、プロジェクト - 再読み込み をすると直せます。

ODFの状態で、文節中の改行を見つけることは結構難しいので、OmegaTでの作業をしている過程で何回か上記の作業を繰り返さなければならないかもしれません。

さらに、印刷してみるとわかりますが、多くの場合、英語の文字のサイズと、日本語の文字のサイズは同じポイント数でも、日本語が若干大きく感じられます。文字の大きさや、文字数などはページのレイアウトに関係してきます。

こういったフォントの調整やレイアウト、印刷時の見え方等のへの配慮は、翻訳者自身の仕事から分離して考えた方がよさそうです。

翻訳の仕事とDTPは本質的に異なる種類の仕事なのですが、両方やらなければいけない状況も少なくありません・・・・。

防衛省がSunのシンクライアント3万台導入 -NIKKEI NET-

Nikkei netで次のニュースが報じられている。

記憶装置なしパソコン、海自が3万台全面導入・10年度までに

防衛省は機密情報の流出防止を狙い、記憶装置を持たないパソコン「シンクライアント端末」を2010年度までに海上自衛隊に全面導入する。海自のパソコンのほぼ全量に当たる約3万台を対象に、米国防総省が使う米サン・マイクロシステムズ製の端末に置き換える。国内でのシンクライアント端末の導入台数では過去最大とみられる。昨年明るみに出たイージス艦の情報流出事件などを受け、防衛情報の厳格管理が国際的に求められているのに対応する。

 防衛省はまず今年3月までに端末数百台を海自の施設に導入。その後艦船などにも順次設置する。海自での成果をみて陸上自衛隊や航空自衛隊への導入も検討する。 (07:00)

http://www.nikkei.co.jp/news/main/20080210AT1D0500Y09022008.html

・・・追記(2008/2/12)・・・
平成18年3月の防衛省の発表: http://www.mod.go.jp/j/news/2006/03/28c.htm
これを見る限り、今回のシンクライアント導入は2年前の情報漏洩をきっかけとし、包括的かつ計画的なセキュリティ対策の一部であることが分かる。決して、シンクライアント導入ですべて解決しようとしている訳ではないように思われます。
以下の私の文章は防衛省のセキュリティ管理や国防に対してと言うより、報道のされ方とその認識の仕方についてふれています。
・・・追記終わり・・・

上記の記事を読むと「機能が制限されたパソコン」を3万台購入していく・・・と取れますが、シンクライアントを動かすためには、必ずそれらにシステムを提供するためのサーバーが必要になりますし、IDの認証を行うためのディレクトリシステムも必要になり、また、ファイルファイルサーバーも必要になります。つまり、パソコンを買ったのではなく、3万台のクライアントを支えるサーバーとそれを動かすためのアプリケーション群(リモートデスクトップなど)を購入したのであり、ネットワークアーキテクチャそのものを購入したことになると、私は判断しています。

ぜひとも、それに伴って「どれくらいのサーバー」が導入されるのかを知りたいし、それを維持していくための人的な運用がどのようにされていくのかについて知りたい。それで、税金がどれくらい使われるのかを知ることができる。それに比べたら端末の規模は伝えるべき情報として、それほど重要ではない。「これくらいのサーバーを配備した結果、3万台の端末を処理する能力を得る」という報じ方のほうがより重要だと感じます。なぜなら、一般の読者の方々の関心事は「税金の使われ方」と「そのシステムの安全性の論拠」、および「そのシステムの規模」だからであり、端末の単価よりも、サーバーの単価がはるかに高価であり、システムの堅牢制や安全性を知るために重要だからだ。

端末からハードディスクを取っ払ったからといって、それだけで安全性は高まらない。セキュリティ維持のための中心点が、分散した状態から集約されるだけだろうと思う。(だけ・・・とはいうものの、大きな進歩で、管理しやすくなるが、それだけでは十分ではないということです)

移行が大変そうですが、そういった作業のほとんどの技術はUNIXベース、Solarisベースではないかと推測しています。

現在どのようなシステムであり、今後、3万台のシンクライアント端末がどこにどのように配置されるかはわかりませんが、支えるためのそれ相応のサーバー必要になるのでしょうし、管理者や技術者も必要になりそうです。

いずれにしても、「集中管理されている」ことをある程度表明できるトポロジーであることは確かです。

「シンクライアント」「ディスクレスクライアント」「ネットワークコンピューター」は90年代の後半、よく耳にしましたが、ほとんどのベンダーが撤退する中、Sunだけはずっと作り続けていました。あまり興味を持たなかったのは、X端末との違いがわからず、「去勢されたコンピューター」のように見えたからで、いわゆる「ワークステーション」や「パーソナルコンピューター」などの端末が力を持つという流れと逆行していたように感じられたからですが、現在、IDカードリーダーなどの認証デバイスやリモートデスクトップ等により任意のOSが使えるようになってきたため、実用性が高まってきたのでしょう。

でも、いずれにしても、このシンクライアント端末を動かすネットワークアーキテクチャーは、まさに、the Network is the Computerではあります。

日本の企業は、こういったアーキテクチャーを提示できないのでしょうか? また、防衛省はなぜ国内のメーカではなく、海外のメーカーを選択したのでしょうか? 国内にはこういったことに対応するための技術力がないのでしょうか?

「国防」のための技術は世界に眼を向けてしかるべきでしょうし、すべて「国産」である必要はないと思うのですが、日本の安全性を維持するための最低限の技術は国内でも見つけられるような状態にはなっていてほしいものです。

・・・どうも、我々は、「シンクライアント」などのカタカナの名詞が出てくると、それで思考が停止してまう傾向がある・・・

OpenSolaris liveupgrade from b52 to b81, my memo.

OpenSolarisではsmpatchできないようなので、LiveUpgradeを試みた際のメモです。

作業の元にしたドキュメント: http://docs.sun.com/app/docs/doc/819-0332/esqbt?a=view

OpenSolaris b52 -> b81 へライブでアップグレードできるでしょうか?
何回かトライしていたのですが、b52では、

# /sbin/biosdev
opening /devices//pci@0,0/pci10de,cb84@2,1/storage@7/disk@0,0:q,raw failed errno 6
opening /devices//pci@0,0/pci10de,cb84@2,1/storage@7/disk@0,1:q,raw failed errno 6
opening /devices//pci@0,0/pci10de,cb84@2,1/storage@7/disk@0,0:q,raw failed errno 6
opening /devices//pci@0,0/pci10de,cb84@2,1/storage@7/disk@0,1:q,raw failed errno 6
biosdev: Could not match any!!
#

が引っかかってluコマンドがうまく進まなかったのですが、Patch: 117435-02 が関係しているようで、この中に含まれている/sbin/biosdevをコピーしたところ、何とかコマンドが進むようになりました。より新しいビルドのOpenSolarisでは修正されているでしょうから、他に新しいビルドのOpenSolarisが走っていれば、そこから持ってきても良かったかもしれません。

新しいOS(b81)のメディアをマウントします。

# lofiadm -a /share/sol-nv-b81-x86-dvd/sol-nv-b81-x86-dvd.iso
/dev/lofi/1

# mount -F hsfs /dev/lofi/1 /mnt

# cd /mnt/Solaris_11/Tools/Installers/
# ./liveupgrade20

....対話的なダイアログが表示される。特に迷う質問はないので答える。...

最初にインストールする際、LiveUpgradeするかもしれないと思い、同じディスクにの/dev/dsk/c2d0s7にルートスライスと同程度の空きスライスを作っておきました。そこに、Boot Environmentを作成します。

# lucreate -c svn_52 -m /:/dev/dsk/c2d0s7:ufs -n svn_81
Discovering physical storage devices
Discovering logical storage devices
Cross referencing storage devices with boot environment configurations
Determining types of file systems supported
Validating file system requests
Preparing logical storage devices
Preparing physical storage devices
Configuring physical storage devices
Configuring logical storage devices
Analyzing system configuration.
Comparing source boot environment file systems with the file
system(s) you specified for the new boot environment. Determining which
file systems should be in the new boot environment.
Updating boot environment description database on all BEs.
Searching /dev for possible boot environment filesystem devices

Updating system configuration files.
The device is not a root device for any boot environment; cannot get BE ID.
Creating configuration for boot environment .
Source boot environment is .
Creating boot environment .
Checking for GRUB menu on boot environment .
opening /devices//pci@0,0/pci10de,cb84@2,1/storage@7/disk@0,0:q,raw failed errno 6
opening /devices//pci@0,0/pci10de,cb84@2,1/storage@7/disk@0,1:q,raw failed errno 6
...
The boot environment does not contain the GRUB menu.
Creating file systems on boot environment .
Creating file system for in zone on .
Mounting file systems for boot environment .
Calculating required sizes of file systems for boot environment .
Populating file systems on boot environment .
Checking selection integrity.
Integrity check OK.
Populating contents of mount point .
Copying.
WARNING: The file contains a list of <42>
potential problems (issues) that were encountered while populating boot
environment .
INFORMATION: You must review the issues listed in
and determine if any must be resolved. In
general, you can ignore warnings about files that were skipped because
they did not exist or could not be opened. You cannot ignore errors such
as directories or files that could not be created, or file systems running
out of disk space. You must manually resolve any such problems before you
activate boot environment .
Creating shared file system mount points.
Creating compare databases for boot environment .
Creating compare database for file system .
Updating compare databases on boot environment .
Making boot environment bootable.
Updating bootenv.rc on ABE .
opening /devices//pci@0,0/pci10de,cb84@2,1/storage@7/disk@0,0:q,raw failed errno 6
opening /devices//pci@0,0/pci10de,cb84@2,1/storage@7/disk@0,1:q,raw failed errno 6
...
Population of boot environment successful.
Creation of boot environment successful.
#
# lustatus
Boot Environment Is Active Active Can Copy
Name Complete Now On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
svn_52 yes yes yes no -
svn_81 yes no no yes -
#

Boot Environmentができたようなので、続いて、新しいメディア(b81)を元にアップグレードします。
/aにオリジナルのパーティションの情報がそっくりそのままコピーされそれを対象にパッケージの更新をおこなっているようです。かなり、時間がかかります。しかし、起動時のOSはまだ稼働中です。

ただ、待っているのも退屈なので、

# tail -f /a/var/sadm/install_data/upgrade_log

と、するとインストールされているパッケージが表示されます。
luupgradeから実行されたパッケージを更新するためのコマンドはnice値が19になっていて優先順位が低くなっています。

# luupgrade -u -n svn_81 -s /mnt
opening /devices//pci@0,0/pci10de,cb84@2,1/storage@7/disk@0,1:q,raw failed errno 6
Copying failsafe kernel from media.
Uncompressing miniroot
Uncompressing miniroot archive (Part2)
13362 ブロック
Creating miniroot device
miniroot filesystem is
Mounting miniroot at
Mounting miniroot Part 2 at
Validating the contents of the media .
The media is a standard Solaris media.
The media contains an operating system upgrade image.
The media contains version <11>.
Constructing upgrade profile to use.
Locating the operating system upgrade program.
Checking for existence of previously scheduled Live Upgrade requests.
Creating upgrade profile for BE .
Checking for GRUB menu on ABE .
Checking for x86 boot partition on ABE.
Determining packages to install or upgrade for BE .
Performing the operating system upgrade of the BE .
CAUTION: Interrupting this process may leave the boot environment unstable
or unbootable.
Upgrading Solaris: 100% completed
Installation of the packages from this media is complete.
Deleted empty GRUB menu on ABE .
Adding operating system patches to the BE .
The operating system patch installation is complete.
ABE boot partition backing deleted.
Configuring failsafe for system.
Failsafe configuration is complete.
INFORMATION: The file on boot
environment contains a log of the upgrade operation.
INFORMATION: The file on boot
environment contains a log of cleanup operations required.
INFORMATION: Review the files listed above. Remember that all of the files
are located on boot environment . Before you activate boot
environment , determine if any additional system maintenance is
required or if additional media of the software distribution must be
installed.
The Solaris upgrade of the boot environment is complete.
Installing failsafe
Failsafe install is complete.

# lustatus
Boot Environment Is Active Active Can Copy
Name Complete Now On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
svn_52 yes yes yes no -
svn_81 yes no no yes -

やっと終わりました。

ブート環境を切り替えます。

# luactivate svn_81
opening /devices//pci@0,0/pci10de,cb84@2,1/storage@7/disk@0,0:q,raw failed errno 6
...
Saving latest GRUB loader.
opening /devices//pci@0,0/pci10de,cb84@2,1/storage@7/disk@0,0:q,raw failed errno 6
...
Generating partition and slice information for ABE
Boot menu exists.
Generating direct boot menu entries for ABE.
Generating xVM menu entries for ABE.
Generating multiboot menu entries for PBE.

**********************************************************************

The target boot environment has been activated. It will be used when you
reboot. NOTE: You MUST NOT USE the reboot, halt, or uadmin commands. You
MUST USE either the init or the shutdown command when you reboot. If you
do not use either init or shutdown, the system will not boot using the
target BE.

**********************************************************************

In case of a failure while booting to the target BE, the following process
needs to be followed to fallback to the currently working boot environment:

1. Do *not* change *hard* disk order in the BIOS.

2. Boot from the Solaris Install CD or Network and bring the system to
Single User mode.

3. Mount the Parent boot environment root slice to some directory (like
/mnt). You can use the following command to mount:

mount -Fufs /dev/dsk/c2d0s0 /mnt

4. Run utility with out any arguments from the Parent boot
environment root slice, as shown below:

/mnt/sbin/luactivate

5. luactivate, activates the previous working boot environment and
indicates the result.

6. Exit Single User mode and reboot the machine.

**********************************************************************

Modifying boot archive service
GRUB menu is on device: .
Filesystem type for menu device: .
Activation of boot environment successful.

# lustatus
Boot Environment Is Active Active Can Copy
Name Complete Now On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
svn_52 yes yes no no -
svn_81 yes no yes no -

新しいBEのActive On Reboot がyesになっています。
いけそうです。 リブートします。

# reboot ではなく、init 6やshutdownを使用しないと、次のgrubのメニューに新しいブート環境が表示されません。

# cat /etc/release
Solaris Express Community Edition snv_81 X86
Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
Use is subject to license terms.
Assembled 15 January 2008

#

と、ここまで、約3時間・・・、新規ネットワークインストールなら15分で終わるのですが・・・
ともあれ、29ビルドを飛び越え、めでたく、ライブアップグレード(リブート一回)できました・・・これで、xVMやCIFS/SMBサーバーやZFSのNバージョンが使えるようになり、安心感がまします・・・が、この後からが長かった (・・・続く・・・・永遠に・・・)

Drupal 6.0 released.

Drupal 6.0 がリリースされています。
http://drupal.org/drupal-6.0

いろいろな機能向上がなされているようで、さっそく、本サイトでもアップグレードを試みたのですが、まだ、追加モジュールが6.0に対応していなかったので、それを待ちたいと思います。

OpenSolaris liveupgrade from b81 to b82, my memo.

前回、b52からb81へのビッグジャンプが成功したので、今度は、b81からb82へのライブアップグレードを試みてみたいと思います。

現状確認:

# lustatus
Boot Environment Is Active Active Can Copy
Name Complete Now On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
svn_52 yes no no yes -
svn_81 yes yes yes no -

# cat /etc/lutab
# DO NOT EDIT THIS FILE BY HAND. This file is not a public interface.
# The format and contents of this file are subject to change.
# Any user modification to this file may result in the incorrect
# operation of Live Upgrade.
1:svn_52:C:0
1:/:/dev/dsk/c2d0s0:1
1:boot-device:/dev/dsk/c2d0s0:2
2:svn_81:C:0
2:/:/dev/dsk/c2d0s7:1
2:boot-device:/dev/dsk/c2d0s7:2

既存BEの削除と新規BEの作成

# ludelete svn_52
Updating GRUB menu default setting
Boot environment deleted.

# lustatus
Boot Environment Is Active Active Can Copy
Name Complete Now On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
svn_81 yes yes yes no -

# lucreate -c svn_81 -m /:/dev/dsk/c2d0s0:ufs -n svn_82
...
Population of boot environment successful.
Creation of boot environment successful.

# lustatus
Boot Environment Is Active Active Can Copy
Name Complete Now On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
svn_81 yes yes yes no -
svn_82 yes no no yes -

新しいメディアのマウントとliveupgradeパッケージの更新。

# lofiadm -a /share/sol-nv-b82-x86-dvd.iso
/dev/lofi/1
# mount /dev/lofi/1 /mnt
mount: /dev/lofi/1 is not this fstype
# mount -F hsfs /dev/lofi/1 /mnt
# cd /mnt/Solaris_11/Tools/Installers/
# ./liveupgrade20
...

アップグレードの開始:

# luupgrade -u -n svn_82 -s /mnt
... 別端末で・・・ # tail -f /a/var/sadm/install_data/upgrade_log ...
...
The Solaris upgrade of the boot environment is partially complete.
Installing failsafe
Failsafe install is complete.
#
# lustatus
Boot Environment Is Active Active Can Copy
Name Complete Now On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
svn_81 yes yes yes no -
svn_82 yes no no yes -

ブート環境の切り替え:

# luactivate svn_82
...
# init 6

.

アップグレード確認:

# cat /etc/release
Solaris Express Community Edition snv_82 X86
Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
Use is subject to license terms.
Assembled 29 January 2008

できました・・・が、その後、いくつか調整が必要になります。

Ticker Test

Staff's Blog: Staff's Blog

初めてのMac

これまでたくさんのコンピューターやOSに触れてきましたが、初めてMacに触れています。このブログは、いつもはLinuxやSolaris、あるいはWindowsで作成するのでが、今日は初めてMacで作っています。

追記:一通り書き終えてから、社会人になりたてのころ、テキストをMac + PageMakerで作っていたことを思い出しました。「漢字Talk」です。すっかり忘れていました。ですから、タイトルは正確には「久々のMac」なのですがそのまま残すことにします。感覚的には「初めて」と言ってもいいくらい、そのときのMacと今のMacは違っています。あの頃は、Windowsでまともに動くDTPソフトはありませんでした。15年ほど前です。

使用しているのは、エントリーマシンのMacBookで、外見が非常に美しくCPUが白いプラスティックでコーティングされているような感じで、「汚してはいけない」と神経を使わせます。

13.3インチの横長のTFTディスプレィはピクセルの粒度が細かく、今まで使っていたディスプレイが粗悪品ではないか?と思わせるくらい粒度が細かくきれいです。

ワイアレス(AirMACといういうらしい)は自宅のアクセスポイントに難なく接続でき、YouTubeでJobsのビッグワードを連発する姿が拝めます。(IPv6を切るまでは接続が不安定でした。Fedoraでも同じ現象があり、その経験が役立ちました。)

標準装備のトラックパッドでは、操作が大変ですので純正のMighty MouseをBluetoothで接続したところ非常に操作しやすくなりました。 いずれにしても、非常にすばらしいコンピューターであり、すばらしいデスクトップ環境であることは間違いありません。それなのに、MacはWindowsと比べると使っている人が多くありません。かつてSGI社のIRIXのデスクトップ環境もずば抜けて美しかったのですが、現在IRIXの姿は見かけません。 価格的にも、最初は若干高い気がしたのですが、ディスプレイ、電源の作り、カメラ、スピーカー、ワイアレス、キーボードなどを含めしっかりと高い品質で作られているように感じられ、実際に触ってみて、他のコンピューターと比べてみてもその価格は妥当な気がしています。 そこで、自分自身、なぜ、これまで、Macを使わなかったか、あるいは購入しなかったか、あるいはそれに関連した仕事に就かなかったのはなぜかを、再考しています(今の仕事を変えるとかではなく・・・)。おそらく、その中にMacのシェアが低い理由のいくつかがあるのではないかと思います。 私自信、納得はできないのですが、「優れたものが、生き残るとは限らない」というのはほぼ常識として受け入れています。 同時に、Windowsはなぜシェアを伸ばせたのか、ここまで、みんなが使うようになったのだろうか? ということも考えさせられますし、その他のSolarisやLinux等のOSは今後どのように広がっていくのか? ということも・・・。 対応しているアプリケーションやゲームが相対的に少ないとか、ハードウェアが選択できないとか、ブラックボックスの部分が多すぎるとか、過去に何回も爆弾マークがでて安定しないとか、価格が高いとか・・・そういった当たり前のことは思いつくのですが・・・ それは、今晩中には考えがまとまりません。 私はJobsの信仰者ではありません。彼について書かれたこの書籍を購入して読んだところ、かなり破天荒な人のようです。綴られているエピソードや、同僚のコメントをみると、なんというか夢想家でありクレイジーな人格です。(この本の写真はとてもきれいでした) しかし、おそらく、彼がリードしなければこのようなずば抜けたすばらしいシステムはできなかったでしょう。もちろん、エンジニアとデザイナーの才能と努力がなければ完成しません。 この仕事をしていると、「なぜLinuxなのですか?」とか「UnixはWindowsと比べて何が優れているのですか?」と聞かれることがあります。未だに明確に理解してもらえる答えを思いつきません。村上龍的にいうと「コンテキストが共有できていない」のだと思いますが、そういったギャップを埋めるための努力は必要だと考えています。 そこにまた一つ「なぜMacが良いと感じるのですか?」という疑問を加えることになりそうです。なぜ、私はLinuxやUnixやMacが好きなのか・・・? すばらしいからなのですが、それを伝えることができず、ちょっとイライラするのです。 ひとまず、そう聞かれたら「なぜ Windows なのですか?」と逆に聞き返して、自分自身の答えを見つける時間を稼ごうと思います。

Mac OS X (Darwin), Java6 + Netbeans 6

Javaはplatform freeなはずなので、Macに不慣れな私でもプログラムは書けるはずだろう・・・

ということで、Time MachineをセットアップしたてのMac OS X 10.5でJavaを使用してみました。


Darwin macbook.local 9.2.0 Darwin Kernel Version 9.2.0: Tue Feb 5 16:13:22 PST 2008; root:xnu-1228.3.13~1/RELEASE_I386 i386

標準で付属してくるJavaは

$ java -version
java version "1.5.0_13"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_13-b05-237)
Java HotSpot(TM) Client VM (build 1.5.0_13-119, mixed mode, sharing)

ちょっと古いので、最新のJDKを探したのですが、Sunでは配布しておらずAppleのDeveloperサイトからダウンロードしました。現時点では、JDK6 Developer Previewとなっています。

http://developer.apple.com/java/

ダウンロードには、Apple Developer Connectionへの登録が必要になります。

さて、ダウンロードしパッケージをインストールすると、
/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home
が、JAVA_HOMEとなるようです。Macのディレクトリレイアウトには不慣れなので、探すのに一苦労です。

続いて、~/.profile あたりに、JAVA_HOMEとPATHを設定します。

JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
export JAVA_HOME
PATH=${JAVA_HOME}/bin:$PATH

設定後の確認。

$ java -version
java version "1.6.0_04-dp"
Java(TM) SE Runtime Environment (build 1.6.0_04-dp-b06-110)
Java HotSpot(TM) 64-Bit Server VM (build 1.6.0_04-b12-45-optimized, mixed mode)

Sunが配布しているJDKにはデモがついてくるのですが見当たらないので、LinuxのJDKのJAVA_HOME/demoをコピーし、簡単なテストを行いました。

$ java -jar Java2Demo.jar

ひとまず動作したので、次にNetbeans6.1Betaを入れてみます。NetbeansはNetbeans.orgでMac OS X用が配布されていました。インストールは難しくありませんでした。

/Applications/Netbeans/Netbeans 6.1 Beta.app
から起動できるようになっています。

うまく起動しましたが、せっかく入れたJDK6を使用していないようです。起動用のシェルスクリプトをみると・・・

~/.netbeans/6.1beta/etc/netbeans.conf を作成し、次の一行を加えると任意のJDKを指定できそうです。

netbeans_jdkhome=${JAVA_HOME}

環境変数JAVA_HOMEは、コマンドライン(シェル)からの起動であればOKなのですが、GUIには設定されておらず無効でした。
環境変数をMacOSのGUIで使用させるためには、~/.MacOSX/environment.plist にXMLで定義するようです。
http://developer.apple.com/qa/qa2001/qa1067.html

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" 
                      "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
	<dict>
        	<key>JAVA_HOME</key>
        	<string>/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home</string>
	</dict>
</plist>
これで最新の環境が揃いました。 不慣れなので、何かと時間がかかりましたが、これでプログラムの作成の取りかかれます。

モバイル環境は今後どうなるのか?

ラジオ(J-Wave)聞いていたら、「ソニーが携帯電話事業から撤退する(Sony Ericssonとは言っておらず、単に、ソニーと言っていた)」と、ナビゲーターが話していたが、それはあまり正確ではなく(あるいは情報が古い)その後、ウェブを見たところ、Sony Ericssonのウェブで正式な発表がありました。

http://www.sonyericsson.co.jp/company/press/20080310_press.html

これを読むと、撤退ではなく「NTTドコモ向け商品化の見直し」とのことで、表現が柔らかくなっています。いずれにしても、決定するのは、メディアではなく、Sony Ericsson自身であり、今後を見守るしかありません。

村上龍が、RVR(ビデオコラム)で、「推測に過ぎないことを垂れ流す番組が多すぎる。正式な調査と発表を待って、本質をじっくり考えたほうが良い」と言っていたが、そのとおりです。あまり、推測で世の中を満たすのは良くないですが、ここからは私の、高い通信料を支払っている、いちモバイルユーザーとしての推測です・・・

Appleが、iPhoneをリリースしていました。これは、今後のモバイル環境を考えるのに良い試金石です。
国内で販売されている去勢されたiPhone, iPod Touchを見ると、それはそれは、魅力的なギアです。当然、これに通話機能がついたら・・・素敵だ・・・と思います。iPhoneにはカメラもついていますが、それも切り取られています。iPhoneのリリースは日本では未定のようです。
http://www.atmarkit.co.jp/fnetwork/rensai/5minkeitai/01.html

さて、この魅力的な端末が日本でリリースされないのは、通信事業会社の通信規格が問題になっているようです。日本はPDCで、GMSではないからというのがその理由のようです。

PDC方式のiPhoneは作れないものかと思うのですが・・・つまり、Appleが日本の通信方式にそった形にカスタマイズすれば良さそうですが、それをしないAppleが頑固なのでしょうか・・・。おそらく、問題はそういった技術的なものではないと推測しています。私の持っている携帯は海外でGMSローミングもできるらしいですから、国内でもPDCローミングできるようにすれば、海外からきた人も、自国のGMS端末がそのまま使えて便利だと思います。(もう、できるのかな?)

*Jobsが最後、値段を発表する際、どうしても「ジャパネットたかた」を思い出し・・・ちょっと引いてしまうが、かれは、自社の作ったものを売っている点が違うとのだ・・・と自分に言い聞かせ夢からさめないようにしている。また、聴衆はサクラではないか?と思わせるくらいノリが良い。どちらにしても、巧妙に演出されているのだろうが、楽しい。

上記のことを単純に考えると・・・、技術的な面だけではない要素で、通信事業会社が端末のデザインや機能をコントロール、あるいは決定する、ということになります。 追記(2008/3/11):後で読み返してみて、若干、この下りは飛躍しています。言いたかったことは、通信方式や国内の市場性によって端末がどこまで制限、制約されるのか? ということを考えたかったのです。 さて、私の使用している携帯電話には、フルブラウザがついていて、それはそれは、小さい端末に高解像度の綺麗なWebの画面を表示してくれますが、実際使ってみて、パケット料金の請求に驚きました。1ページ見ると数百円請求されている計算になります。月に5000円払えば使い放題になるそうですが、使う気にはなれません。音楽をダウンロードすると、一曲数千円になるそうです。(著作権料金ではなく、単にパケット料金だけだと思います)

何かボタンを押す度に、「ここからは料金が発生します」の確認画面がでてきて「同意しますか?」となり、自分が何を探していたのか忘れてしまうほどです。

ならば、この端末に高度な機能は不要であり、インターネットでコンテンツを見るには安いPCで大きな画面でゆっくり見ればよく、端末の料金に5万円は高い気がしています。私は、単に、小型の端末が欲しかったのですが、これよりも小型で薄型の端末はショップにありませんでした。今でも、この小ささに関しては満足です。N社のこの端末の技術はすごいと感じています。

コマーシャルの、特定条件でのみの「無料」や「割引」や、やたらと複雑なポイント制の割引の宣伝も空虚に聞こえます。

アクセスが安価な豊かなインターネットの世界は、モバイルでは一昔前のプロバイダー料金のように割高になるのです。

Windows CE/Mobile機は、各社、通信事業会社が出しているようです。これは、多くの場合、無線LANともリンクできるようです。 さて、話を戻すとソニーはPSPという世界に通用する携帯ゲーム機を出しています。これは、無線LANにも対応しています。ですから、やはり、同じように、携帯電話と融合したら・・・と誰でも考えるはずです。同じSonyだからと言って簡単に統合しないでしょうが、理想的には・・・という話です。また、なんと無く、Sonyは国内の事情に合わせて動く気もしますが、Sony Ericssonは世界規模で動いている会社で市場は日本だけでは無いと思います。

しかし、仮に、PSPと通話機能が融合しても、通信料金の問題があり、端末本来の機能、つまり、広大な資産であるインターネットに乗り入れるには、通信事業会社の取り決めた料金を支払うか、無線LANを使用するかの選択になります。

ちょっとまった・・・この様な融合はありえるでしょうか? 私は、詳しく知りませんが、端末のデザインや機能は誰が決めるでしょうか?

市場にでている「携帯電話」を見ると、どれも似たり寄ったりで、かつ、機能がたくさんあるようですが、何か、とても使いにくい・・・ボタンをおすと、勝手に料金が引き落とされているような気がするが、料金が「テレビ電話通話料」「音声通話料」「FOMA使用料」「パケット料金(1パケット512バイト、約0.2円だそうです)」。それに、何とか割引とポイントが加算され、足したり引いたりして、合計月一万円とかになるのですが、こういった複雑さは一見几帳面な気はするのですが、ほぼ把握不能の状態に陥り、結果、なるべく使わないようにしよう・・・となり、素晴らしいコンテンツや、端末のデザインを生かしきれなくなります。

JavaScriptの大量のプログラムをダウンロードし、結果、「JavaScriptエラーです」となって、表示されなかった場合、料金は請求されるのだろうか? 多分される。

非常に美しいデザインのウェブページが、ブラウザの表示能力の限界で、つぶれて表示され、文字が読めない状態になったときに、料金は請求されるのだろうか? 多分される。

Sony Ericssonは、撤退では無く見直し・・・と言っているが、何を言おうとしているのか? 見直したければ、別に公表する必用もなかろうに・・・。現在の携帯電話の状況は、通信事業者の影響力が大きくなっていて、端末の機能性やデザインにまでその影響が及んでいるのであれば、健全な状態では無いように感じている。

他に優れいているもの、使いやすいものがあるにも関わらず、使いずらいものを、押し付けられている、もしくは、端末やソフトウェアの発展がセーブされているのではないだろうか?

日本は、いち早く携帯電話が発達した国です。このことは誇って良いことだと思います。しかし、かなり金がかかるようになってきて利権が大きくなってきたように思います。発展のためには、一時的に閉鎖的な状況も必要だろうが、その閉鎖性が生む「何か」にしがみついていると、次の発展ができなくなってしまうのではないだろうか?

また、なんでもグローバル化すれば良いとは思いませんが、世界に目を向けたときに、より良いものがあったときは、現在の閉鎖性を解き放ち、それを選ぶ方が健全だと思います。しかし、そういった行為は内側の価値観から「反逆」「破戒」「反抗的」「非常識」「異端」などのレッテルを張られることになってしまうでしょう。そういったプレッシャーを打ち破れなければ、新しいことは実現できないのでしょう。

三公社五現業が解体されたとしても、本質はそういった制度のようなものにあるのではなく、むしろ、私たち一人一人の理想主義の崩壊によるものだと感じている。現状は、決定的に、暗く、陰湿で、必要以上に複雑だ。ワーキングプアは夢みる力すら奪われる。負けてはいけない。

OpenSolaris liveupgrade from 82 to 84, my memo

前々回は、b52からb81へのアップグレード、
前回は、b81からb82へのアップグレードでした。
まったく、方法は変わりませんが、今回は、b82からb84へのアップグレードの手順を注釈なしのコマンドラインのみで記録します。(繰り返しはいざというとき大事・・・)

確認
現在使用しているスライスが /dev/dsk/c2d0s0 (BE Name : svn_82)
新しいBEのためのスライスが /dev/dsk/c2d0s7 (BE Name: svn_84)

# lofiadm -a /iso/sol-nv-b84-x86-dvd.iso
/dev/lofi/1

# mount -F hsfs /dev/lofi/1 /mnt

# pkgrm SUNWlucfg SUNWlur SUNWluu

# cd /mnt/Solaris_11/Product
# pkgadd -d . SUNWlucfg SUNWlur SUNWluu

# lustatus
Boot Environment Is Active Active Can Copy
Name Complete Now On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
svn_82 yes yes yes no -

# cat /etc/lutab
1:svn_82:C:0
1:/:/dev/dsk/c2d0s0:1
1:boot-device:/dev/dsk/c2d0s0:2

# lucreate -c svn_82 -m /:/dev/dsk/c2d0s7:ufs -n svn_84
(about 30 min...)

# lustatus
Boot Environment Is Active Active Can Copy
Name Complete Now On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
svn_82 yes yes yes no -
svn_84 yes no no yes -

# luupgrade -u -n svn_84 -s /mnt
OTHER TERM# tail -f /a/var/sadm/install_data/upgrade_log

# luactivate svn_84

# init 6

OmegaT: SubVersionでの共有に関して


OmegaTでのプロジェクトフォルダをSubVersionで共有しようとしたのですが、うまくいかない点がでてきました。回避方法を考えます。

「参考翻訳メモリフォルダ:」と「用語集フォルダ:」は参照用なので共有可能です。
ですから、チェックアウトし、編集し、コミットしても問題ないようです。

「原文ファイルフォルダ:」と「訳文ファイルフォルダ:」に関してですが、まず、原文ファイルフォルダ内のドキュメントをベースに作業を行った後、「プロジェクト」->「訳文ファイルを生成」とすると、「訳文ファイルフォルダ (target)」に「原文ファイルフォルダ (source)」内の.svnディレクトリがコピーされているようです。

追記(2008/4/2):上記の問題は、OmagaT 1.7.3 Update2 および 1.8 Beta Update1で修正されたようです。
http://sourceforge.net/tracker/index.php?func=detail&aid=1774502&group_i...

こうなってしまうと、targetとsourceディレクトリ内のSubVersionの管理情報がおかしくなります。具体的には、targetの情報がsourceと同じになり、結果、コミットしたり、その他の操作を行うと、source内のファイルをtargetで上書きしたり、あるいはコマンドがエラーを出したりします。

「訳文ファイルを生成」を実行したときの、フォルダの作り方を調整すればよいのでしょうが、ちょっと面倒なので、それは、ペンディングにしたいと思います。

では・・・、現行ではどうすればよいか? なのですが、まずは、訳文ファイルフォルダ(target)は、SubVersionの対象から除外した方が良さそうす。訳文は、omegat/project_save.tmxがあれば生成できますので、記録しておかなくても再生可能です。

リポジトリ内のファイルを元に生成される情報をリポジトリにコミットしない(ソース、あるいは成果物を生成するプログラムだけをおいておく)というのは、不自然な考え方ではないので、フォルダごとまとめてコミットできないのは若干不便ですが、不具合の回避は可能です。

OmegaT: ... is Translation Memory Application.

OmegaTは、Translation Memory Application です。
Translation は翻訳と訳せます。

翻訳を辞書で引くと・・・

ある言語で表された文章を他の言語に置き換えて表すこと。(大辞泉 - Yahoo辞書)

と書かれています。

OmegaTは文章を「文節」単位で分割し、それに対する翻訳者の翻訳を記録し、(文節単位で)再利用しやすい状態にしてくれます。
これは、もちろん便利で、助かります。二度同じ文章を訳さなくてもすみますし、入力ミスも減り、推敲が進み、精度も上がっていくことが期待できます。しかし、文節単位での訳だけでは、全体の文章として読み返したときに、意味のとおる文章にならないようです。

もう一つ、似た言葉で「通訳」があります。

Interpretation - 通訳を辞書で引くと・・・

異なる言語を話す人の間に立って、双方の言葉を翻訳してそれぞれの相手方に伝えること。(大辞泉 - Yahoo辞書)

となっていて、明らかに「翻訳」よりも「通訳」の方が高度です。
そして、読み手は「通訳」されたものを読みたいと感じるはずです。

ドイツ国家検定通訳・翻訳士 のあるページ( http://www.euroassist.de/language/theory.htm )に、次のように表現されていましたので引用させていただきます。(優れた文章だと思います)

『訳す』という行為について

ここに書いてある内容は、訳する原言語と訳出する目的言語の両言語における言語能力が、高レベルの教育を受けたそれぞれの言語を母国語とする者の能力と少なくとも同じ状態であるか、それに限りなく近い状態にあることを前提とします。言語能力に不完全な部分が残されている状況では『翻訳』『通訳』行為を理論的に捉えることはできません。

『翻訳』『通訳』が単なる言葉の置き換えでないとすれば、そのプロセスを純粋な言語の次元だけでなく、そこで行われる『コミュニケーション』全体から捉える必要があります。

人間同士の会話というコミュニケーションにより伝達されるのは、発話者の『意図』です。この『意図』というのは発話者が言葉にした文章の『意味』とは違います。

誰かが会話のある時点で『Ich habe ein Auto』と発言したとします。この文の『意味』を日本語にすれば『私は車を持っています。』になりますが、この文だけを取り出した場合にはこの文を述べた時の発話者の『意図』はまったくわかりません。車のセールスマンとの会話で新車を勧められている時であれば、その意図は『車はあるので新しい車をかうつもりはありません。』となるでしょうし、友人たちと次の日曜日のピクニックの予定を話し合っている時であれば『私の車で出かけましょう。』という意図にもなります。

これからわかるようにコミュニケーションにおいて言語が果たす役割は重要ではあるものの、数々の構成要素のひとつに過ぎないということです。『Ich habe ein Auto』という文はそれ単独では『文法にのっとって配列された記号の集合体』であって、たとえひとつひとつの記号の『意味』がわかっていても、コミュニケーションにより伝達されるべき内容について決定的な手がかりを与えてくれるものではありません。

上記の指摘や例は私にとって非常にしっくりきます。
つまりは、ある文章や言葉による表現は、「意図」を伝えるための手段であり、全体の理解があって部分の訳し方が決定されてくる、ということだと理解しました。

さて、OmegaTは、「翻訳作業」には向いていますが、元々「文節単位での処理と再利用」のサポートなので、上記のようなセオリー(文節の単純な言語の置換だけでは、意図を伝えるために不足である)からすると、文全体の通訳はしてくれませんし、コンピューターでの処理は非常に難しいでしょう。

ですから、Translation Memoryを使用して、実際に意味の通るようなドキュメントを作成したい場合、二つの行程を経る必要があるように感じています。

・・・まずは、対象のドキュメントを通読し、全体を理解した上で・・・

行程1: 「OmegaTを使用しての文節単位の単純翻訳」 ツール上での文節単位での翻訳文の再利用性を高めるため、あるいは、 翻訳対象の漏れを防ぐために、OmegaTで単純な文節翻訳を試みる。全体的な文章は、次の行程で整えるので、ここでは、あまり文脈に依存しないような一般的な置き換えで構わない。

行程2: 「全体の文章の通訳」 OmegaTでの成果物と原文を見比べながら、全体として読み手が読みやすいような文章を記述する。ここで、原文と訳文の文節の対応は壊しても構わない。また、ここでは、文脈を意識するため、機械的な文節単位での再利用性はほぼ失われる。

行程1)の成果物(翻訳メモリー)は、次のプロジェクトでも再利用できますが、上記のような理由から、「翻訳メモリ」が理解できる文章を組み立ててくれる訳ではなく、最終的には、人間が意味を考えながら、読み手を考えながら作成する行程が必ず必要であることは忘れてはいけない点だと感じました。

いわゆる「翻訳」が、どのレベルまで要求されているのか(単純翻訳なのか、きちんと「通訳されているのか」)は、依頼を受ける際に理解しておく必要があると感じます。

すごく良く歩いた日であった。

今日は、実に良く歩いた。そして、同じ場所をいったりきたりであった。
どらくらい動いたのか、確認してみた。

1. 通勤、最寄り駅まで (徒歩 800m)
2. 通勤、(電車 3.5Km)

明後日までにU.S.に書類を送らなければならないので、Fedexの集荷所まで行くことになる。

3. 集荷所の最寄り駅まで向かう (電車9.0Km)