時間が足りなくなった

しばらく遊ぶ時間が確保できなそうだ。

以下遊んでいるというに相応しいモノ。

ベースとなるデータを設定したオブジェクトを継承して子オブジェクトを作りたい。何を思ったかSeasar2で実験したらこうなった。

<component class="Template" name="base">
  <property name="engine">freemaker</property>
  <property name="writer">console</property>
  <property name="basePath">/</property>
</component>

<component class="Template" name="child">
  <initMethod>#self.extendsTemplate(base)</initMethod>
  <property name="path">test.ftl</property>
</component>

ここでいうTemplateクラスにextendsTemplateなるメソッドを用意してやりました。道具の使い方を間違えてます。。。インスタンスを引き継いでデータを設定できるが、引き継ぐ元のインスタンスは都度ディープコピーされる仕様です。何がしたかったのか目的がすり替わってきました。今はプログラミングできるだけで楽しかったりする。

確か最初はデータを一括で定義しておいて、データは構造的に定義できて、定義しておいたテンプレートを一括でマージして、指定した方法で一括で出力できる。みたいなツールだった気がする。だいぶ目的がズレていた。上記コードは実際のコードをだいぶ簡略化したもので実は動いてます。作るのが楽しくて寄り道と分かっていても動くレベルまで作ってしまう。これぞ趣味だと言える気がする。でもこんな時間もしばらくおあずけだ。

見えぬ化(またはみえぬ化)

良く見えるようにする前に見なくても良いなら見たくない、いやむしろ見えなくしてくれ = 見えぬ化?

見えるから見てしまうんだ。見なくていいなら見えなくしてくれ!それが見えぬ化サービス!!

聞いたことアリマセン。。。

不良品の山を見えぬ化します → 歩留まりを高める → 不良品削減 → 不良品の山が消える → 見えぬ化?

いやこれは歩留まりが悪い理由を解決してるだけで見えぬ化は結果だなぁ。みえる化同様手段にはならないか。

手抜きのための努力は惜しみません!

誤解を恐れずに言うならこう言いたい。

必要であった手数を省いたのに結果が変わらない(orより良くなる)上おまけ(時間とかお金とか)もついて返って来るというなら手抜きもいいですよねと。

誤解を受ける言い方だから効率化とか改善とか言ってくれというならおっしゃるとおりです(笑)

テンプレートエンジンへ渡すデータの楽な定義の仕方はないもんか

簡単な方法は無いもんかと模索中。ぱっと思いついたのを列挙してみる。

  • put(key, value)のコードをハードコーディング
  • key = valueのプロパティファイル形式で指定
  • <key>value</key>のXML形式で指定
  • OGNLで指定
  • JSONテキスト形式

オブジェクトを渡すのではなく、あくまで外部からテキストデータを渡す事を想定している。

単純な形式ならkey = valueで良いと思うけど、データが親子の構造を持つようになると定義の仕方が面倒になる。そうなるとJSONテキストとXMLが有利だけど、書くのがめんどくさい。じゃぁアウトラインエディタを使えばいいんじゃね?というとそうかもしれない。書くのが面倒なら書くのが楽になるツールを使えばいいだけの話かもしれない。

でも単なるXMLだと親子関係は定義できても、親を継承した子供をたくさん独立で定義するというのが定義できない。例えていうなら<子 extends="親"></子>な感じ。いや、定義自体はできているがこいつを解釈するプログラムが必要になってくる(作るのは手抜きを諦めた時)。

そこで実験してみた。今作ってる"何か"にXMLを読み込んでソースコードを出力する定義をした。実行してみるとソースコードが出てきた。だけどXMLを定義するのがめんどくさいので、単なるテキストファイルを読み込んでXMLを吐き出す定義をしてみた。XMLできた。テキスト→XML→ソースという定義をしてみた。できた。2度エンジンが走るけれど、書く手間は大幅に減った。これでいいじゃん・・・ということで、このエントリの最初に戻る(笑)

結局最初にどういう風にデータを定義するのかが問題であって、その中間にどんな形式がいようが最終的な形式がどうなろうがそれを変換する定義をすりゃいいだけの話だと分かった。あとは自分で実験してみて楽だ〜しっくりくる〜という方式を見つけるしかないのでコツコツ実験します。データ定義言語なるものは無いかと思ったらグーグル先生は「それをDDLというんだよ!」と検索結果で返事してきた(笑)私が欲しいのはそれじゃないんです・・・(でもRDBにデータを定義するというのはそれはそれでありだと思った)。そういうのはXMLってのがあるんですよとも言われましたけど、XMLで定義済みの言語とパーサが欲しいんですよというと、見つからないぞもっと適切なキーワードをよこせと言われる。仕方ないのでまず理想を考えて現実とすり合わせする事にします。

VelocityとFreeMakerのテンプレートの読み込み方

相対パスで指定するからクラスパスから良きにはからって読んでくれ!が私の要求(笑)

Velocityはいつぞや調べたので覚えている。velocity.propertiesにこう書けばOK。

resource.loader=class
class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader

それでFreeMakerはfreemaker.propertiesにどう定義するんだ?というのが見つからない。マニュアルのTemplate loadingを見ても書いてない。そもそもfreemaker.propertiesに関する情報が見当たらない・・・。ちゃんと調べるなり、ソースを見るなりは今日はやめてコードで指定しました。

Configuration cfg = new Configuration();
cfg.setClassForTemplateLoading(getClass(), "/");

これでpackageName/template/hoge.vmとpackageName/template/hoge.ftlが使えるようになった。

いま作っているのはVelocityとFreeMakerとExcelがテンプレートエンジンとして使える仕様ですが、Excelを汎用的なテンプレートに使うのは考えただけでもめんどくさそう。きっとどこかに既にあると信じて今日は終わり。今日は結構遊んだなー。