赤紫蘇・忍坂ことはじめ

河童プロジェクトチーム 森野
(Version 0.1.2 2003/02/09)


このページは、赤紫蘇(原産種)のページです。現在開発中のバージョン、赤紫蘇2の原型となる実装に基づいてかかれています。
このコードをベースに、XMLBindからいただいたブレークスルーをミックスして、赤紫蘇2の開発が進行しています。
SourceForge.jp


ごあいさつ

赤紫蘇でできること

赤紫蘇は、クラスインスタンスの永続化を行うライブラリです。既存のクラスの宣言に、おまじないを追加すれば、即、永続化対応クラスが作成できます。
永続化は、XMLとSOXのシリアライザ・デシリアライザにより実装されています。

赤紫蘇の、長い名前は、

AKAXISO(赤紫蘇) = Also Known As XML: Incarnation of Serializable Objects

です。επιστημηさんに頂きました。やりぃっ。

XML/SOXパーサは、道化師さんの世界樹(Yggdrasil)を使っています。
オプションで、Apacheの定番XMLパーサ、Xerces-C++を使用することもできます。

世界樹の導入で、赤紫蘇は、独立したライブラリとなり、XMLパーサなどの他ライブラリのインストールが必要なくなりました。
(道化師さん、多謝多謝っ(^^ )

忍坂でできること

忍坂は、XML-Schemaドキュメントから、赤紫蘇用おまじない付きクラスを出力します。

実は、赤紫蘇では、おまじない付きクラスからスキーマを出力する機能を実装する予定でした。
ということは、XML-Schemaからおまじない付きクラスのソース生成ってことは、

忍坂(OSIXAKA) = 赤紫蘇(AKAXISO)の逆

となったわけです。ハイ。この名前も、επιστημηさんにいただきやした。(^^


ダウンロード

こちらからです。

akaxiso-0.1.3.zip (470 Kbyte)

NOTE akaxiso-0.1.3 : Xerces-C++ 名前空間対応版 としてアップデートしました。


ビルド

赤紫蘇自体は、他のライブラリを必要とせず、ビルドできます。

実は、赤紫蘇は河童プロジェクトのライブラリなのです。子河童君に働いてもらって、テストを作成してあります。
テストを動作させるためには、CppUnit-1.9.6以降が必要です。また、Xerces-C++2.2以降も必要となります。
必要に応じて、インストールしてください。

Linuxな人のビルド

何も考えずに、configure/makeしてください。


unzip akaxiso.zip
cd akaxiso
./configure
make

Xerces-C++を使いたい方は、configureする前に、

export XERCESC_ROOT=/usr/local
などと指定してください。XERCESC_ROOTで指定されたディレクトリの下に、include/xercesc、lib/libxerces-c.soが、あるようにしてください。

Windowsな人向けのビルド

Projectsディレクトリ以下に、VC6用のプロジェクトファイルがあります。
おもむろに開いて、好きなように、ビルドしてください。

ibakaxiso、testakaxisoプロジェクトは、Xerces-C++を使用する形で、ビルドできます。
Xerces-C++を使用される方は、構成として"Win32 XercesC"を選択して、ビルドしてください。l
(インクルードパス、オブジェクトのパスなど、確認しておいてくださいまし。)

ビルドが完了すると、akaxiso/binディレクトリに、実行可能ファイルが、akaxiso/libディレクトリに赤紫蘇ライブラリができあがります。


とりあえず、動かしてみる

XML・SOXへのシリアライズ

サンプルプログラムとして、河童プロジェクト要員名簿を作成してあります。akaxiso/sampleディレクトリをご参照くださいませ。
ビルドされたバイナリは、akaxiso/sample(Linux)、もしくは、akaxiso/bin(Windows)に作成されます。

早速、シリアライズを試してみましょ。
Linuxの人は、akaxiso/sampleに移動、Windowsの方は、akaxiso/binに移動して、コマンドプロンプトから、おもむろに、


$./serialize (Linux)

C:\HOGE\akaxiso\bin>serialize (Windows)

と入力してください。河童プロジェクト要員名簿がXMLで出力されたことと思います。
ちなみに、河童プロジェクトは、以下の人々により、運営されています。どうぞ、ごひいきに。

<?xml version="1.0" ?>

<cuppa:project
 xmlns:cuppa="http://unittest.org/memberlist">
    <cuppa:project_name>Cuppa project team</cuppa:project_name>
    <cuppa:url>http://unittest.org</cuppa:url>
    <cuppa:members>
        <cuppa:member>
            <cuppa:name>Episteme</cuppa:name>
            <cuppa:title>God of dragon</cuppa:title>
        </cuppa:member>
        <cuppa:member>
            <cuppa:name>Shibukawa</cuppa:name>
            <cuppa:title>Artistic director</cuppa:title>
        </cuppa:member>
        <cuppa:member>
            <cuppa:name>Doukeshi</cuppa:name>
            <cuppa:title>Wraith of the trickstar</cuppa:title>
        </cuppa:member>
        <cuppa:member>
            <cuppa:name>Ahiru</cuppa:name>
            <cuppa:title>BCB guru</cuppa:title>
        </cuppa:member>
        <cuppa:member>
            <cuppa:name>Ueno</cuppa:name>
            <cuppa:title>Emacs Maestro</cuppa:title>
        </cuppa:member>
        <cuppa:member>
            <cuppa:name>Tomohiro Yoshida</cuppa:name>
            <cuppa:title>What would you like to be?</cuppa:title>
        </cuppa:member>
        <cuppa:member>
            <cuppa:name>shelarcy</cuppa:name>
            <cuppa:title>RELAX NG Evangelist</cuppa:title>
        </cuppa:member>
        <cuppa:member>
            <cuppa:name>Ando(&amp;o)</cuppa:name>
            <cuppa:title>Sorcerer of macuppa</cuppa:title>
        </cuppa:member>
        <cuppa:member>
            <cuppa:name>Morino</cuppa:name>
            <cuppa:title>Farmer</cuppa:title>
        </cuppa:member>
    </cuppa:members>
</cuppa:project>

 

次には、SOXでのシリアライズです。

$./serialize --sox(Linux)
C:\HOGE\akaxiso\bin>serialize --sox (Windows)

と入力してください。今度は、河童プロジェクトメンバー名簿がSOXで出力されたでしょう。

cuppa:project>
        xmlns:cuppa="http://unittest.org/memberlist"
        cuppa:project_name>
                Cuppa project team
        cuppa:url>
                http://unittest.org
        cuppa:members>
                cuppa:member>
                        cuppa:name>
                                Episteme
                        cuppa:title>
                                God of dragon
                cuppa:member>
                        cuppa:name>
                                Shibukawa
                        cuppa:title>
                                Artistic director
                cuppa:member>
                        cuppa:name>
                                Doukeshi
                        cuppa:title>
                                Wraith of the trickstar
                cuppa:member>
                        cuppa:name>
                                Ahiru
                        cuppa:title>
                                BCB guru
                cuppa:member>
                        cuppa:name>
                                Ueno
                        cuppa:title>
                                Emacs Maestro
                cuppa:member>
                        cuppa:name>
                                Tomohiro Yoshida
                        cuppa:title>
                                What would you like to be?
                cuppa:member>
                        cuppa:name>
                                shelarcy
                        cuppa:title>
                                RELAX NG Evangelist
                cuppa:member>
                        cuppa:name>
                                Ando(&o)
                        cuppa:title>
                                Sorcerer of macuppa
                cuppa:member>
                        cuppa:name>
                                Morino
                        cuppa:title>
                                Farmer

気が向いたら、serializeプログラムの中、のぞいてみてください。
C++クラスのインスタンス作成、値設定、がserialize.cpp内部で行われているのが、確認できることと思います。
project.hには、おまじない付きクラスが、いくつかならんでいます。

赤紫蘇は、このように、C++クラスインスタンスを、XML/SOXに、シリアライズすることで、インスタンス内部の情報を保存することができます。

おまじない付きクラスの書き方は、”おまじないの唱え方(作成中)"にて。おまちくださいまし。(^^


インスタンスの復元

XML/SOX形式からのデシリアライズ

今度は、シリアライズされた、XML/SOXストリームを、デシリアライズして、インスタンスの復元を行います。
デシリアライズは、parseプログラムで行います。

おもむろに、以下を実行してください。

$./serialize | ./parse(Linux)
C:\HOGE\akaxiso\bin>serialize | parse(Windows)

こういう出力が得られたはずです。

Member list of 'Cuppa project team'(http://unittest.org)
name : Episteme            Title : God of dragon
name : Shibukawa           Title : Artistic director
name : Doukeshi            Title : Wraith of the trickstar
name : Ahiru               Title : BCB guru
name : Ueno                Title : Emacs Maestro
name : Tomohiro Yoshida    Title : What would you like to be?
name : shelarcy            Title : RELAX NG Evangelist
name : Ando(&o)            Title : Sorcerer of macuppa
name : Morino              Title : Farmer

おもむろですが、parse.cppの中をのぞいてやってください。
パーサから、いきなり、ドキュメントのインスタンスができているのが、わかると思います。
また、このインスタンスは、project.hにて、おまじないをかけたクラスのインスタンスです。
パーサが、XML/SOXのドキュメントから、C++のクラスのインスタンスを生成して、値を割り付けてくれているのです。(^^

あとは、普通のC++プログラムの要領で、コンテナ内の要素を列挙、表示しています。

XMLでOKなら、次は、SOXです。以下を実行します。

$./serialize --sox | ./parse --yggsox(Linux)
C:\HOGE\akaxiso\bin>serialize --sox | parse --yggsox(Windows)

XMLによるシリアライズ、デシリアライズの時と同様の結果が得られたはずです。

以上、インスタンスの永続化、でけましたよね。(^^


今度は忍坂

次は、忍坂を動かしてみます。

忍坂は、XML-Schemaファイルから、おまじない付きクラスを生成してくれるツールです。

さっきの、河童プロジェクトメンバ―名簿のXML-Schemaが、akaxiso/osixaka/sample/sample.xsdとして、作成されています。
# 忍坂は、名前空間未対応なので、その分は、いじってあります。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>

 <xs:element name="project">
  <xs:complexType>
   <xs:sequence>
     <xs:element ref="project_name"/>
     <xs:element ref="url"/>
     <xs:element ref="members"/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>

 <xs:element name="project_name" type="xs:string"/>
 <xs:element name="url" type="xs:string"/>

 <xs:element name="members">
  <xs:complexType>
   <xs:sequence>
    <xs:element ref="member" minOccurs="0" maxOccurs="unbounded"/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>

 <xs:element name="member">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="name" type="xs:string"/>
    <xs:element name="title" type="xs:string"/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
</xs:schema>

このファイルから、おまじないクラスを作成します。

Linuxの人は、akaxiso/osixaka/sampleディレクトリに移動してください。で、以下を実行。

../osixaka < sample.xsd

Windowsの人は、akaxiso/binから、以下を実行。

C:\HOGE\akaxiso\bin\osixaka < ..\osixaka\sample\sample.xsd

実行すると、以下のメッセージが、コンソールに出力されます。

Generating document.h...done.
Generating setup.h/.cpp...done.
Generating element.h...done.
Generatiion completed.

doucment.hには、ルートノードを納めるクラスが、生成されます。

element.hには、それぞれのエレメントが、setup.h/.cppファイルには、永続化のおまじないと、おまじない初期化コードが入っています。

以上の4つのファイルに加え、akaxiso/osixaka/sample/parser.cppをあわせてビルドすると、河童プロジェクトメンバー名簿ドキュメントを、デシリアライズできるパーサが、できてしまいます。
これに、河童プロジェクトのメンバ名簿である、sample.xmlを食わせると、sample.xmlのデシリアライズ、シリアライズが、行われます。

この手順を自動化したのが、akaxiso/osixaka/sample/do_sample.sh(Linux)、akaxiso/osixaka/sample/do_example.batです。

やってみてぇね。


To do, or not to do.

赤紫蘇や忍坂には、いろいろと必要になる機能がたくさんあることでしょう。

必要な機能は、もちのこと、実装していきます。
しかし、「ややこしくなく、軽く」を意識しているため、XML-SchemaやSOXに完全に準拠するための多くのコードを、すべては、実装しないでしょう。どんなライブラリにしようか、模索中です。

いろいろとみなさんのお声をきかせてくださいな。こちらまで。(^^