-不動産

M&A効果なのかわかりませんが、仕事が伸びてきたのとそろそろ新事業もしっかりやらないといけないことから、近日に事務所が手狭になる予定なので、ここしばらく不動産を見てます。また、机などの什器も。いまでも椅子はアーロンチェアで統一してますが、机と会議室スペースのつくりとかに余地がたっぷりあります。いい什器って減価償却の5年をとうに超えても十分に使えるので、たいした投資ではないのです。でも毎日使うものだから、へぼいとがっかりなんですね。いろいろ業者をあたってわかってきたのは、相当オシャレなオフィスを作っても、フリーレント2ヶ月でおつりがくるらしい。人件費や家賃のように毎月かかるものではないので経営的なインパクトは無い。あとは不動産屋ががんばってネゴるだけかと思うと、かなり夢が膨らみます。おそらく熱帯魚の水槽も置くことになるのでしょう(http://d.hatena.ne.jp/masataka_k/20050721#1121933768)。ネオンテトラあたりかな(笑。
ということで、面積的には現在の倍ぐらいでデザイナブルなオフィスにする予定。候補は渋谷は宮益坂の新築ビル。現事務所が渋谷駅からとても近いので、それに比べると若干駅からは遠くなりますが、それでも至近です。どのぐらい新築かというと、今日時点では10階建ての4階までしかできてないってぐらい新築。来年の4月に入居可能だそうな。。。待てないのでさらに不動産回りしてます。でも、たぶん渋谷の駅周辺という条件は変わらないでしょう。私ももう一人の役員も徒歩通勤だし。

ということで、引き続き正社員・契約社員・アルバイト募集。特に正社員。長くビジョン(まあ、BLOGでは特に語ってませんが。。。)を共有できる方、プログラマーはもっと幸せになってよいと思ってる方、ぜひ応募してほしいと思います。ということで、03-5469-8869に電話ください。

-論点

http://asip.tdiary.net/20050725.html#p01
ふむ、ということで、論点はXHTMLXMLの仕様の関係はどうかということに絞られるのかな?私はXHTMLXMLの上位であると読んでましたが、ASIPさんはその解釈に問題をなげかけているという。koichikさんはそこに丁寧な論考を重ねてくれています。GJ。とにかくXHTMLXMLだと思います。
ただ、興味深いんだけど、ここだけの論点ならMayaのピュア性を左右するほどの議論ではないかと思います。Mayaのピュア性はデザインとロジックを分離する点にあって、混在させるのは元よりカウンターパート対策と位置づけてます。私はまだ、XHTMLXML上位としか思ってませんが、その仕様解釈がたとえ間違っていたとしても(いまだ持って間違ってるとは理解できてないですが)、その一点で「安易に」標準仕様を汚染するプロダクトを作ってるかのように言い切られるときついな〜。安易じゃないって。
意地悪すると「Sunが要素に対して定義した名前空間をMayaでは属性に対して適用している。」といわれてるけど、Sunの人は要素にも名前空間を定義してないよ。JSPカスタムタグのURI名前空間じゃないから。XML属性への名前空間解釈も間違っていたでしょ。「XMLの設計思想」って何?
で、そんなことはどうでもいいから、建設的にMaya仕様をよりよくするには、どうすればいいかを教えてほしいな。お願いいたします。
あと、さっき初めて読んだんだけど、Seasar4でbackport175が意味をなさないこととか。。。(http://asip.tdiary.net/20050713.html#p02)じゃあ、どうしたほうがよいのかな?私はこのbackport175はすごいことだと思うんだけどね。まあ、ほかにもあるけど、いいや。

-テンプレートのピュア度(1)

MayaではHTMLの記述と動的機能のプログラミングについて、HTMLテンプレートと別ファイルによって動的機能を記述する方法と、HTMLテンプレートに直接動的機能を記述する方法の2通りの方法があります。デザインとロジックの分離の利点からMayaを利用する場合は前者、Mayaの付加機能を利用するがファイルを分離したくない場合には後者のアプローチを利用することになるでしょう。
HTMLテンプレートと分離して動的機能を記述する際には、テンプレートのファイル名が同じ、ただし拡張子が.mayaとした(index.htmlに対して、index.maya)XMLを作成します。.mayaファイルには、HTMLテンプレート中のid属性もしくはXPathによるパターン一致による紐付けでテンプレート中のどの部分に動的機能を適用するかを記述指定します。この場合、HTMLテンプレート中にはHTMLもしくはXHTML等のテンプレート記述の仕様に反するものは一切記述しないので、テンプレートが完全にピュアなものとなります。
一方、HTMLテンプレートに直接動的機能を追加するには、XML名前空間の仕様を利用して構築されている、Mayaの独自仕様に従って記述する必要があります。HTMLには本来名前空間の適用がないので、完全にピュアなHTMLとはなりませんが、WEBブラウザやHTMLオーサリングツールでは問題なく表示されるデザイン再現性の高い仕様となっています。

-テンプレートのピュア度(2)

まず、HTMLテンプレートに動的機能を直接埋め込む際の詳細について、そのHTML仕様およびテンプレートがXHTMLの場合のXHTML仕様への齟齬について言及していきます。

<html xmlns:m="http://maya.seasar.org"
         xmlns:c="http://java.sun.com/jsp/jstl/core">
  <body>
    <p>
      <span m:inject="c:out" c:value="Hello">bye</span>
    </p>
  </body>
</html>

まず、HTMLには名前空間概念がないので仕様的には「xmlns:m="〜"」といった名前空間の宣言は許されていません。また、spanタグに記述されているような「m:inject="〜"」などの仕組みも許されていません。しかし、WEBブラウザ等のツールでは仕様外の属性についてレンダリング上、無視するように実装されていますので、デザインの再現性においてはなんら阻害するものではありません。HTML仕様に許されない記述を行いたくない場合には、HTMLテンプレートと.mayaファイルによるデザイン-ロジック分離を行ってください。

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
         xmlns:m="http://maya.seasar.org"
         xmlns:c="http://java.sun.com/jsp/jstl/core">
  <body>
    <p>
      <span m:inject="c:out" c:value="Hello">bye</span>
    </p>
  </body>
</html>

XHTML documents are XML conforming.」とXHTML1.0仕様冒頭にまず書かれているとおり、XHTMLは完全にXML仕様の上位に構築されています。つまり、XHTMLはその仕様において明確に規定してない事項についてはXMLの仕様が遵守されるのです。XHTMLXML名前空間仕様に関して制限的に規定している項目は、デフォルト名前空間(xmlns="〜"により宣言される名前空間)が「http://www.w3.org/1999/xhtml」の値を取ることです。ほかに制限するものはありません。よって、XHTMLにおいて用いるxmlns:m="〜"などの名前空間宣言はXHTML仕様に適合する記述方法です。また、その宣言された名前空間を属性に用いることもXHTMLにおいて制限されていません。。。と思うんだよね。

-テンプレートのピュア度(3)

しかし、Mayaにはこれら状況を破壊するようなUgly仕様があります。

<html xmlns:m="http://maya.seasar.org"
         xmlns:c="http://java.sun.com/jsp/jstl/core">
  <body>
    <p>
      <c:out value="Hello">bye</c:out>
    </p>
  </body>
</html>

これがOK。しかし、これをOKにするためには拡張レゾルバをmaya.confに記述する必要があります。

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE service
  PUBLIC "-//The Seasar Foundation//DTD Maya Config 1.0//EN"
    "http://maya.seasar.org/dtd/maya-conf_1_0.dtd">
<service>
  <templateBuilder>
    <resolver class="〜略〜.DirectInjectionResolver"/>
  </templateBuilder>
</service>

このように、maya.confにDirectInjectionResolverを登録します。これはデザインとロジックの分離より推奨しない機能ですが、こう書きたい方やこう書かなければならない事情もあるだろうということより実装されている機能です。
この場合、「c」というプレフィックスに対応する名前空間URIが、Sunの定義者の意図に反しないか?という心配はまったくありません。なぜなら、Sunの人はこのURIを「XML名前空間URI」として定義していないからです。思い出してください。JSPにはXML名前空間概念がまったくありません。このURIの使い方は、

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

と書かせる際の、JSPカスタムタグの識別URIであって、記述方法をスキーマ的に定義するものの一部ではありません。また、XML名前空間の仕様ではこの名前空間URI値は仕様として特別に意味をもたせておらず、利用するツールなどで自由に意味づけすることが許されています。Mayaでは、JSPカスタムタグライブラリおよびプロセッサライブラリの指定のためのURIに用いてますが、これはXMLやHTML等の仕様に反するものではないと考えております。

-XML仕様のピュア度(1)

さて、次は.mayaファイルの名前空間の利用方法です。こちらは、基本的にXMLですが故意にMayaにて仕様拡張していることがあります。それは、名前空間の指定を省略した際の解釈方法です。名前空間やそのマッピングプレフィックスを省略せずに完全に記述した場合には、なんらXML仕様に反するものはありません。しかし、プレフィックス記述を省略したときにも状況依存でMayaが解釈する機能が搭載されています。私はこの一点をもって、あえて「歪曲」と言ってますが、どうですかね。たぶん、みなさんもこれまで知らなかったであろう、XML名前空間仕様の隙間を突いてます。「デフォルト名前空間は属性には適用されない」というこの仕様に反しています。ね、知らなかったでしょ。2月だか3月だかにMayaの名前空間仕様を作ったときに、これはまいったなと思いましたが、後に説明すればいいやと考え、今日に至ってます。
まあ、言わずもがなだと思うけど、W3C勧告はかなり読んでるつもりなんだよなあ。ま、読み込みが足りないのかもしれませんけど。。。あとは仕様の隙間はXerces先生に質問です。Java世界ではXerces先生がOKと言えば、OKなことが多い。Crimson先生には聞いてません。

-XML仕様のピュア度(2)

<c:out value="Hello">bye</c:out>

HTMLテンプレート、.mayaファイル問わず、上記のように書かれた場合、Mayaはそのvalue属性のようにプレフィックスを省略されたものについては独自の解釈を行います。本来のXML名前空間仕様によると、valueは名前空間なしです。これは「デフォルト名前空間は属性には適用されない」というXML名前空間の仕様がありますので、たとえ文書のデフォルト名前空間を指定していたとしても、その名前空間は適用されません。たとえばXHTMLでは「http://www.w3.org/1999/xhtml」というURIをデフォルト名前空間に適用しますが、上記例のvalue属性はこの名前空間には属しません。
しかし、Mayaはこのvalueは、エレメントの属する名前空間「c」にプレフィックスされるものに属すると解釈します。つまり上記例は、

<c:out c:value="Hello">bye</c:out>

と記述されたものと等価です。さらには、エレメントの名前空間も省略時に独自解釈する機能があります。

<span m:inject="c:out" c:value="Hello">bye</span>

とあったとき、spanエレメントは、XHTMLならばデフォルト名前空間の「http://www.w3.org/1999/xhtml」に属するでしょう。また、XMLならばその定義された値が適用されます。しかし、デフォルト名前空間の宣言を省略した場合が問題です。MayaはHTMLテンプレートにおいてデフォルト名前空間を省略されると「http://www.w3.org/TR/html4」というURIを、.mayaファイルにおいてデフォルト名前空間が省略されると「http://maya.seasar.org」が補完されます。よって、

<element id="element1" qName="br"/>

.mayaファイルに上記記述がされたとき、

<m:element m:id="element1" m:qName="br"/>

と記述された場合と等価となります。属性の名前空間は.mayaファイルなので「http://maya.seasar.org(サンプルの場合、大抵m:にマッピング)」になるため、m:elementとなり、idやqNameは所属するエレメントの名前空間が適用され、m:idおよびm:qNameになります。

-XML仕様のピュア度(3)

ということで、一連の現状解説は終わりです。仕様に適合することを求める場合は、HTMLテンプレートと.mayaファイルを分離すること、.mayaファイルには全てのエレメントと属性に省略することなく名前空間を適用することが、条件となります。
一方で、ファイルを減らしたり、記述量を省略する機能も搭載されていますので、些細ではありますが物量を減らした開発をしていただくことも可能です。Mayaの場合、大抵の場合には複数方法で記述できるようにしています。利用者がどのような好みを持ってるか、どのような事情の下で開発しているかは不明なためです。今回のように、仕様に忠実でありたいとお考えの場合、おそらく類をみない外部仕様忠実度を実現することができます。これが基本的な機能です。ただ、冗長な部分などについては、省略形や違う実現方法を用意しています。
正直、よく考えた仕様だなと自分では思ってますが(笑、より磨く意見がありましたらぜひお聞かせください。世に出す前にいくらでも直しますので。

-XML仕様のピュア度(4)

さらにもうひとつ。名前空間の適用がMayaの動作上どう解釈をしようと、XMLとしての記述はウェルフォームドなんで、記述仕様に反したものはないですね。意味の取り方としてMayaの独自仕様が一部にあります。