河童プロジェクトチーム 森野 (Version 0.1.2 2003/02/09)
ごあいさつ
・赤紫蘇でできること 赤紫蘇は、クラスインスタンスの永続化を行うライブラリです。既存のクラスの宣言に、おまじないを追加すれば、即、永続化対応クラスが作成できます。 永続化は、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)の逆 となったわけです。ハイ。この名前も、επιστημηさんにいただきやした。(^^
・赤紫蘇でできること
赤紫蘇は、クラスインスタンスの永続化を行うライブラリです。既存のクラスの宣言に、おまじないを追加すれば、即、永続化対応クラスが作成できます。 永続化は、XMLとSOXのシリアライザ・デシリアライザにより実装されています。 赤紫蘇の、長い名前は、 AKAXISO(赤紫蘇) = Also Known As XML: Incarnation of Serializable Objects です。επιστημηさんに頂きました。やりぃっ。 XML/SOXパーサは、道化師さんの世界樹(Yggdrasil)を使っています。 オプションで、Apacheの定番XMLパーサ、Xerces-C++を使用することもできます。 世界樹の導入で、赤紫蘇は、独立したライブラリとなり、XMLパーサなどの他ライブラリのインストールが必要なくなりました。(道化師さん、多謝多謝っ(^^ )
赤紫蘇は、クラスインスタンスの永続化を行うライブラリです。既存のクラスの宣言に、おまじないを追加すれば、即、永続化対応クラスが作成できます。 永続化は、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)の逆 となったわけです。ハイ。この名前も、επιστημηさんにいただきやした。(^^
忍坂は、XML-Schemaドキュメントから、赤紫蘇用おまじない付きクラスを出力します。
実は、赤紫蘇では、おまじない付きクラスからスキーマを出力する機能を実装する予定でした。 ということは、XML-Schemaからおまじない付きクラスのソース生成ってことは、
忍坂(OSIXAKA) = 赤紫蘇(AKAXISO)の逆
となったわけです。ハイ。この名前も、επιστημηさんにいただきやした。(^^
ダウンロード
こちらからです。 ・akaxiso-0.1.3.zip (470 Kbyte) NOTE akaxiso-0.1.3 : Xerces-C++ 名前空間対応版 としてアップデートしました。
こちらからです。
・akaxiso-0.1.3.zip (470 Kbyte)
NOTE akaxiso-0.1.3 : Xerces-C++ 名前空間対応版 としてアップデートしました。
ビルド
赤紫蘇自体は、他のライブラリを必要とせず、ビルドできます。 実は、赤紫蘇は河童プロジェクトのライブラリなのです。子河童君に働いてもらって、テストを作成してあります。 テストを動作させるためには、CppUnit-1.9.6以降が必要です。また、Xerces-C++2.2以降も必要となります。 必要に応じて、インストールしてください。
赤紫蘇自体は、他のライブラリを必要とせず、ビルドできます。
実は、赤紫蘇は河童プロジェクトのライブラリなのです。子河童君に働いてもらって、テストを作成してあります。 テストを動作させるためには、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が、あるようにしてください。
何も考えずに、configure/makeしてください。
Xerces-C++を使いたい方は、configureする前に、
Windowsな人向けのビルド
Projectsディレクトリ以下に、VC6用のプロジェクトファイルがあります。 おもむろに開いて、好きなように、ビルドしてください。 ibakaxiso、testakaxisoプロジェクトは、Xerces-C++を使用する形で、ビルドできます。Xerces-C++を使用される方は、構成として"Win32 XercesC"を選択して、ビルドしてください。l (インクルードパス、オブジェクトのパスなど、確認しておいてくださいまし。) ビルドが完了すると、akaxiso/binディレクトリに、実行可能ファイルが、akaxiso/libディレクトリに赤紫蘇ライブラリができあがります。
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(&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へのシリアライズ
サンプルプログラムとして、河童プロジェクト要員名簿を作成してあります。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(&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/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です。 やってみてぇね。
次は、忍坂を動かしてみます。
忍坂は、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に完全に準拠するための多くのコードを、すべては、実装しないでしょう。どんなライブラリにしようか、模索中です。 いろいろとみなさんのお声をきかせてくださいな。こちらまで。(^^
赤紫蘇や忍坂には、いろいろと必要になる機能がたくさんあることでしょう。
必要な機能は、もちのこと、実装していきます。 しかし、「ややこしくなく、軽く」を意識しているため、XML-SchemaやSOXに完全に準拠するための多くのコードを、すべては、実装しないでしょう。どんなライブラリにしようか、模索中です。
いろいろとみなさんのお声をきかせてくださいな。こちらまで。(^^