2004年06月25日
川俣晶の縁側ソフトウェアModulaF開発日誌total 4692 count

ModulaF技術概要・これが動いているModulaFだ! まだ限定的な機能しか実装されていないけれど

Written By: 川俣 晶連絡先

 やっとMagSite1 0.31に、限定的なModulaFの初期バージョンが組み込まれました。

 本来ならModulaF開発キットを公開して、それに十分な解説ドキュメントを付けるべきですが、そこまで作業する余裕がありません。

 とりあえず、現状のModulaFで可能なことと機能を解説しておきます。

 (このページはソースの横幅まで文章が広がってレイアウトされる可能性があり、少し読みにくいかもしれません。その点はご容赦を。ちょっと改善すべき点です)

ModulaFを体験する §

 MagSite1 0.31は、手動で特定のURLを叩いた時のみ、ModulaF経由でコンテンツを返します。通常の運用ではModulaFを経由しません。

 ModulaF経由でコンテンツを見るには、ファイル名Content.aspxのURLに対して、.aspxを.modfに書き換えてアクセスします。

 たとえば、http://mag.autumn.org/Content.aspx?id=20040625155120なら、http://mag.autumn.org/Content.modf?id=20040625155120と書き換えます。パソコンから見た場合、どちらを見てもほとんど同じに見えると思いますが、できるだけ同じになるように作ってあるだけで、内部処理は全く異なっています。

i-mode携帯から見る §

 i-mode携帯をお持ちの方は、上と同じhttp://mag.autumn.org/Content.modf?id=20040625155120をi-mode携帯で閲覧してみて下さい。同じ内容ですが、i-mode HTMLに準拠した内容が返送されています。ModulaFを経由しない場合は、そのような機能は動作せず、まさにModulaFの力で実現しているものです。

 このように相手によって違う内容を返送するのは、相手のUser Agent名によってXSLT変換を切り替えるメカニズム(後述)が動作しているためです。

 ちなみに、電子メールアドレスの部分に注目してみて下さい。分かりにくいと思いますが、パソコン向けに送信する場合はPNG形式、i-mode向けに送信する場合はGIF形式の画像が送信されています。この相違は、デフォルトのXSLT変換は用意された画像URLの中でPNG形式を使い、i-mode用のXSLT変換は、用意された画像URLの中でGIF形式を使うことで実現しているものです。

中間言語を覗き見る §

 XSLT変換を使用していることから分かるとおり、ModulaFではより抽象的な中間コンテンツ記述言語を経由して、そこから(X)HTMLを得ています。

 URLのパラメタに、output=xmlを付加すると、この中間言語を覗き見ることができます。上記コンテンツの中間言語表現を見る場合は以下のURLを使います。

http://mag.autumn.org/Content.modf?id=20040625155120&output=xml

 この情報からページを組み立てるXSLT変換を記述できれば、どのようなデバイスにも対応ができます。

XSLT変換の選択メカニズム §

 どのXSLT変換を使用するか指定するファイルは以下のような内容になっています。

 これは、UserAgent情報に適用する正規表現と、マッチした場合に使用するXSLT変換のファイル名のペアで構成されています。

 これらの情報は設定の上から順番にチェックされ、マッチしたものが使用されます。この例では、最後のua:item要素にはua:rexp要素が含まれず正規表現が指定されていませんが、これは他の全ての指定にマッチしなかった場合に使われるデフォルトの指定となります。

<?xml version="1.0" ?>

<ua:list xmlns:ua="http://http://www.piedey.co.jp/xmlns/modulaf/useragents">

    <!-- i-mode HTML -->

    <ua:item>

        <!-- DoCoMo/で始まる -->

        <ua:rexp>^DoCoMo/</ua:rexp>

        <ua:filename>i-mode_html.xslt</ua:filename>

    </ua:item>

    <!-- PC XHTML -->

    <!-- rexp要素抜きの場合は無条件に決まる -->

    <ua:item>

        <ua:filename>pc_xhtml.xslt</ua:filename>

    </ua:item>

</ua:list>

 なお、XSLT変換のファイルを検索するパスは、別途web.configファイル中に記述できるようになっています。

ページを定義する.modfファイル §

 ページを定義する.modfファイルは、最も重要なファイルです。

 上記の例で使われるコンテンツ閲覧ページの.modfファイルの内容は以下のようになっています。

<?xml version="1.0" encoding="Shift_JIS" ?>

<it:modulafContent xmlns:it="http://www.piedey.co.jp/xmlns/modulaf/interim"

    xmlns:wr="http://www.piedey.co.jp/xmlns/modulaf/wordref"

    xmlns="http://www.w3.org/1999/xhtml"

    sitedef="sitedef.xml" pageClass="user"

    >

    <!-- saveCombinedDocument="d:\delme" -->

<!-- ページ固有の情報 -->

<it:pageInfo>

    <it:modref type="assembly" 

        targetAssembly="MagSiteLib.dll" 

        targetClass="MagSiteLib.ModualFModule"

        targetMethod="PageInfoHandler" />

</it:pageInfo>

<!-- 通常コンテンツモジュール -->

<it:module layout="main" primary="true" option="must">

    <it:modref type="assembly" 

        targetAssembly="MagSiteLib.dll" 

        targetClass="MagSiteLib.ModualFModule"

        targetMethod="ContentMainHandler" />

</it:module>

<!-- 汎用フッタモジュール -->

<it:module layout="footer" option="should">

    <it:body>

        <!-- 汎用メニュー構築 -->

        <it:menu />

        <!-- 汎用管理者表記構築 -->

        <it:administrator />

    </it:body>

</it:module>

<!-- システム情報通知モジュール -->

<it:module layout="footer" option="should">

    <it:body>

        <p>Powered by <a href="http://www.piedey.co.jp/magsite1/">MagSite1</a>

Version 0.30 (Beta-Test)</p>

        <p>Copyright (c) 2004 Pie Dey.Co.,Ltd.</p>

    </it:body>

</it:module>

</it:modulafContent>

 ここで最も重要な要素はit:module要素です。これがページ上の1つのモジュールを表現します。

 it:module要素の内部には、中間言語を直接記述することができます。たとえば、「システム情報通知モジュール」とコメントした下のモジュールは、そのように記述されています。ここでは、更にコンテンツ本体を示すit:body要素の中に、直接XHTMLのコードが書き込まれています。このような書き方もOKです。

 (と、ここまで書いて気付きましたがバージョン番号が定数として書き込まれていますね。これは後で要訂正です)

 より高度な使い方は、it:module要素の内部にモジュール参照のit:modref要素を記述することです。ここでは、type="assembly"で参照する種類が.NET Frameworkのアセンブリであることを指定し、targetAssembly属性で対象とするアセンブリのファイル名を指定し、targetClass要素でクラス名を指定し、targetMethod属性でメソッド名を指定します。ここで指定されたメソッドは、モジュールハンドラと呼ばれ、XML文書の断片を出力します。その出力内容が、it:modref要素と置き換えられて、XSLT変換の入力となる中間言語文書となります。

 it:module要素と似て非なるものに、it:pageInfo要素があります。これは、モジュールではなく、XSLT変換が参照する汎用のページ情報を格納します。

 その他に、特殊な役割を持った要素がいくつかあります。it:menu要素は、あとで説明するサイト定義ファイルsitedef.xmlより自動的に構築されるメニューを生成させます。it:administrator要素は、管理者の連絡先情報を生成させます。

モジュールハンドラ §

 アセンブリとして作成するモジュールハンドラは、出力に使用するwriter、パラメタのリスト、そのモジュールのID (it:module要素に付加されるid属性の値)を受け取り、writerにモジュールの内容を中間言語形式のXML文書断片として出力します。

 以下は、コンテンツのタイトルが"テストコンテンツ"で、本文内容が指定文字列を内容に持つXHTMLのp要素となる内容を返すモジュールです。

using System;

using System.IO;

using System.Xml;

namespace TestModule001

{

    public class ModuleHelloWorld

    {

        private const string xmlnsInterim = 

                        "http://www.piedey.co.jp/xmlns/modulaf/interim";

        private const string xmlnsXhtml = "http://www.w3.org/1999/xhtml";

        public static bool HelloWorld( XmlWriter writer, object paramList,

                                                               string id )

        {

            writer.WriteElementString("title",xmlnsInterim,"テストコンテンツ");

            writer.WriteStartElement("body",xmlnsInterim);

            writer.WriteElementString("p",xmlnsXhtml,

                      "静的なモジュール定義ファイルに記述されたコンテンツ。");

            writer.WriteEndElement();

            return true;

        }

    }

}

 このようなモジュールハンドラをいくつも作ってライブラリ化しておき、.modfファイルからそれらのモジュールハンドラを参照したり、参照から削ったりすることで、ページを組み立てて行きます。

重要度とレイアウトレイアウト §

 it:module要素にはいくつかの属性が付いています。これらは、ページを構成する上で、重要な役割を持ちます。

 まず、layout属性は、そのモジュールがページのどの位置にレイアウトされるかのヒント情報を記述します。mainであれば最も中央に。footerであればページ下部に置かれたいという意図を表現します。詳細は、これがModualFによる表現だ! 調査試行の成果をちょっと公開の中の「オマケ: レイアウトについて」の部分をご覧下さい。

 primary属性はどれが最も主要な役割を持ったモジュールかを指定します。たとえばページ全体の名前は、primary="true"とされたモジュールに含まれる名前が採用されます。

 option属性は以下の値を持ち、制限の厳しいデバイスでの省略の可否を指定します。

・must

 そのモジュールは、そのページに必ず含めなければならない

・should

 必須ではないが含めるべきである

 (それを含めない正当な理由がない限り含める)

・may

 含めても良いし、含めなくても良い

 (データ量が問題にされる場合は含めるべきではない)

・external (未実装)

 そのモジュールは別ページで参照可能とし、そのページへのリンクを含めても良い。

 たとえばオマケとしてページに入れる「今日の運勢」モジュールは、容量制限の厳しい携帯電話向けページには含めないようにするために、option="may"を指定する、といった選択が出来ます。また、ページ横に付けるリンク集などは、option="external"と指定し、同じページ内に含めずにリンクとして表現することができます。(おそらくは、同じページに特殊なパラメタを付けて識別されるURLへのリンクに変換される)

サイト定義ファイルsitedef.xml §

 サイト定義ファイルsitedef.xmlは、用語やサイトの全体構造を定義しています。

 MagSite1 0.31のsitedef.xmlは以下のような内容です。

<?xml version="1.0" ?>

<sd:siteDefinition  xmlns:sd="http://www.piedey.co.jp/xmlns/modulaf/sitedef"

                    xmlns:wd="http://www.piedey.co.jp/xmlns/modulaf/worddef"

                    xmlns:wr="http://www.piedey.co.jp/xmlns/modulaf/wordref"

                    xmlns="http://www.w3.org/1999/xhtml" >

    <sd:term>

        <wd:keyword>キーワード</wd:keyword>

        <wd:content>コンテンツ</wd:content>

        <wd:trackback>トラックバック</wd:trackback>

        <wd:totalAccessCount>total <sd:count /> count</wd:totalAccessCount>

        <wd:recentlyAccessCount>3days <sd:count 

                                         /> count</wd:recentlyAccessCount>

        <wd:lower>下位</wd:lower>

        <wd:upper>上位</wd:upper>

        <wd:top>最上位</wd:top>

        <wd:front>表紙</wd:front>

        <wd:syndication>RSS1.0形式の情報</wd:syndication>

        <wd:site>サイト</wd:site>

        <wd:author>著者</wd:author>

        <wd:administrator>管理者</wd:administrator>

        <wd:contact>連絡先</wd:contact>

        <wd:iconPicture>タイトル画像</wd:iconPicture>

        <wd:trackBackURI><sd:hostUriPath />tb.aspx/<sd:contentIdentifier

                                                     /></wd:trackBackURI>

        <wd:peruNameTM>Amazon.co.jp(TM)</wd:peruNameTM>

        <wd:peruTopUrl>http://www.amazon.co.jp/</wd:peruTopUrl>

        <wd:byPeruAssociateProgram>by<a href=

   "http://www.amazon.co.jp/exec/obidos/subst/associates/join/associates.html/"

            >Amazon Associate Program</a></wd:byPeruAssociateProgram>

    </sd:term>

    <sd:group pageClass="user">

        <sd:contentURI>Content.modf?id=<sd:contentIdentifier/></sd:contentURI>

        <sd:siteTopURI>default.aspx</sd:siteTopURI>

        <sd:keywordTopURI>default.aspx?s=<sd:keywordIdentifier

                                                       /></sd:keywordTopURI>

        <sd:picturePageURI>Pic.aspx?id=<sd:contentIdentifier

              />&amp;n=<sd:attachedFileNumber/>&amp;w=<sd:pictureWidth

              />&amp;ret=Content.modf%3fid%3d<sd:contentIdentifier

              />%23<sd:fragmentIdentifier/></sd:picturePageURI>

        <sd:menu>

            <!-- このサイトの表紙 -->

            <sd:item>

                <sd:name><wr:site/>の<wr:front/></sd:name>

                <sd:URI>default.aspx</sd:URI>

                <sd:description>この<wr:site/>の<wr:front

                                          />へ移動します</sd:description>

            </sd:item>

            <!-- このキーワードの表紙 -->

            <sd:item>

                <sd:name>この<wr:keyword/>の<wr:front/></sd:name>

                <sd:URI>default.aspx?s=<sd:keywordIdentifier/></sd:URI>

                <sd:description>この<wr:keyword/>の<wr:front

                                           />へ移動します</sd:description>

            </sd:item>

            <!-- このキーワードのコンテンツ全リスト -->

            <sd:item>

                <sd:name>この<wr:keyword/>の<wr:content/>全リスト</sd:name>

                <sd:URI>List.aspx?s=<sd:keywordIdentifier/></sd:URI>

                <sd:description>この<wr:keyword/>の<wr:content

                                  />全リストへ移動します</sd:description>

            </sd:item>

            <!-- このキーワードのシンジケーション -->

            <sd:item>

                <sd:name>この<wr:keyword/>の<wr:syndication/></sd:name>

                <sd:URI>rss.aspx?s=<sd:keywordIdentifier/></sd:URI>

                <sd:description>この<wr:keyword/>の<wr:syndication

                      />へ移動します。RSSアグリゲーター向けの情報で、

                      人間が読むには適しません。</sd:description>

            </sd:item>

        </sd:menu>

    </sd:group>

    <sd:group pageClass="admin">

        <sd:siteTopURI>admin.aspx</sd:siteTopURI>

        <sd:keywordTopURI>admin.aspx?s=<sd:keywordIdentifier/></sd:keywordTopURI>

        <sd:contentURI>Content.modf?id=<sd:contentIdentifier/></sd:contentURI>

        <sd:picturePageURI>Pic.aspx?id=<sd:contentIdentifier

 />&amp;n=<sd:attachedFileNumber/>&amp;w=<sd:pictureWidth/></sd:picturePageURI>

        <sd:menu>

            <!-- このサイトの表紙 -->

            <sd:item>

                <sd:name><wr:site/>の<wr:administrator/>用<wr:front/></sd:name>

                <sd:URI>admin.aspx</sd:URI>

                <sd:description>この<wr:site/>の<wr:administrator/>用<wr:front

                                              />へ移動します</sd:description>

            </sd:item>

            <!-- このキーワードの表紙 -->

            <sd:item>

                <sd:name>この<wr:keyword/>の<wr:administrator/>用<wr:front

                                                                  /></sd:name>

                <sd:URI>admin.aspx?s=<sd:keywordIdentifier/></sd:URI>

                <sd:description>この<wr:keyword/>の<wr:administrator

                                 />用<wr:front/>へ移動します</sd:description>

            </sd:item>

            <!-- コンテンツ追加 -->

            <sd:item>

                <sd:name><wr:content/>追加</sd:name>

                <sd:URI>AdminWrite.aspx?s=<sd:keywordIdentifier/></sd:URI>

                <sd:description>この<wr:keyword/>に新しい<wr:content

                                                 />を追加する</sd:description>

            </sd:item>

            <!-- このキーワードのカスタマイズ -->

            <sd:item>

                <sd:name>カスタマイズ</sd:name>

                <sd:URI>AdminEditDef.aspx?s=<sd:keywordIdentifier/></sd:URI>

                <sd:description>この<wr:keyword

                                  />の表示をカスタマイズする</sd:description>

            </sd:item>

        </sd:menu>

    </sd:group>

</sd:siteDefinition>

 sd:term要素以下は用語の定義です。仮に、りすと亭をModulaF対応させると仮定すると、<wd:keyword>キーワード</wd:keyword>は<wd:keyword>メーリングリスト名</wd:keyword>あるいは<wd:keyword>リスト板名</wd:keyword>となり、<wd:content>コンテンツ</wd:content>は<wd:content>メッセージ</wd:content>に変更されることになるでしょう。MagSite1利用時にも、<wd:content>コンテンツ</wd:content>という表記が気に入らない場合、これを<wd:content>コラム</wd:content>などに書き換えて使うことができます。

 sd:group要素以下はページグループの定義になっています。グループはsd:group要素のpageClass属性で区別されます。ここではpageClass="user"というユーザー向けのページグループと、pageClass="admin"という管理者向けページグループが存在します。sd:siteTopURI要素などは、それぞれの役割を持ったページのURIを示しますが、グループによって内容が異なっていることが分かると思います。ユーザー向けの場合は<sd:siteTopURI>default.aspx</sd:siteTopURI>となっていますが、管理者向けでは<sd:siteTopURI>admin.aspx</sd:siteTopURI>と別のページを示しています。

 sd:menu要素は自動的に生成されるメニューの構造について記述しています。グループごとに内容を変えることができます。

終わりに §

 駆け足になりましたが、ModulaFの現状を簡単に解説しました。

 ご参考になれば幸いです。

付録・中間言語の要素について §

 メモ程度の内容しかありませんが、中間言語の要素には以下のようなものがあります。

it:pageInfo

 管理者情報などページ固有の情報を記述します。

it:administrator

 管理者情報を記述するか、管理者情報の出力を要求します。

it:name

 その文脈での名前を記述します。

it:email

 その文脈での電子メールアドレスを記述します。画像の参照として記述します。

it:contentID

 コンテンツのID。

it:iconPicture

 ページに付加するアイコン的な画像のURL。

it:title

 その文脈でのタイトル。

it:date

 その文脈での日付。

it:author

 その文脈での著者情報。

it:keyword

 その文脈でのキーワード情報。

it:item

 その文脈での情報を区分する単位。

it:prev

 日付順で手前のコンテンツに関する情報。

it:next

 日付順で次のコンテンツに関する情報。

it:digest

 コンテンツのダイジェスト情報。

it:summary

 キーワードのサマリ情報。

it:totalAccessCount

 トータルのアクセスカウントの数値。

it:recentlyAccessCount

 最近ののアクセスカウントの数値。

it:whiteSeparatorBetweenParagraphs

 コンテンツ内で、改行のみの空行に相当する空白を空けることを要求する。

it:trackBackList

 トラックバック一覧。

trackBackURI

 コンテンツにトラックバックするURI。

it:from

 トラックバック元サイト名。

it:uri

 トラックバック元URI。

it:menu

 sitedef.xmlで記述したメニューの生成を要求する。

it:referList

 リンク集などの参照する項目のリストの生成を要求する。

it:rank

 ランキングリスト時のランキング数値。

it:lastUpdatedDate

 キーワードの最終更新日付

it:URI

 リンク集のリンクURI

付録・現在のバージョンで実現されたこと・されないこと §

 MagSite1 0.31添付のModulaFで実現されたことは以下の通りです。

  • モジュールの集合体によるページ構成
  • 中間コンテンツ記述言語による論理構造と物理構造の分離
  • サイト定義ファイル(sitedef.xml)によるメニュー構成、用語、サイト構成などの汎用カスタマイズ
  • デバイスの種類によって増減される自動レイアウト
  • User Agent情報から複数XSLT変換の提供
  • 電子メールアドレスをPNGとGIFにより提供

 実現されていないことは以下の通りです。

  • 優れたパフォーマンスの発揮
  • 各XML文書のスキーマ作成
  • ページの一部を別ページに割り当ててリンクする
  • 長いページはヘッダーやフッターなど、適切なレイアウトを維持したまま自動的に複数分割する
  • モジュールの直接記述とモジュールのアセンブリ参照を除くそれ以外のモジュール参照 (コマンドラインツールの標準出力をXML文書断片として受け取る等)
  • .NET Framework+IIS以外の環境で動作する実装 (現時点で具体的な開発予定無し。誰かチャレンジしないものですかね?)

Facebook

キーワード【 川俣晶の縁側ソフトウェアModulaF開発日誌
【ModulaF開発日誌】の次のコンテンツ
(ありません)
【ModulaF開発日誌】の前のコンテンツ
2004年
06月
09日
PCとi-modeで異なるXSLT変換が適用されている開発途中のスクリーンショット
3days 0 count
total 3433 count

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

https://mag.autumn.org/tb.aspx/20040625171340
サイトの表紙【ModulaF開発日誌】の表紙【ModulaF開発日誌】のコンテンツ全リスト 【ModulaF開発日誌】の入手全リスト 【ModulaF開発日誌】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.36 (Alpha-Test) Copyright (c) 2004-2021 Pie Dey.Co.,Ltd.