赤紫蘇・忍坂ことはじめ

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

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

ごあいさつ

> ・赤紫蘇でできること

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

> > 赤紫蘇の、長い名前は、

> > ＡＫＡＸＩＳＯ(赤紫蘇) = 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

> Ｘｅｒｃｅｓ-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に完全に準拠するための多くのコードを、すべては、実装しないでしょう。どんなライブラリにしようか、模索中です。

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