Monthly Archives: 11月 2010

JavaScriptクライアントサイドテンプレートエンジン(続き)

一昨日の続きです。

その後修正を加えたバージョンを公開します。

やったこと:

  1. 外部JS化しました。
  2. dataをcontrollerにしました。
  3. HTMLタグの出力と、属性の変更も実装してみました。

TeplateEngine.js (仮のファイル名)

TemplateEngine = new function() {
this.currentNode;
this.writeText = function (value) { return new WriteText(value); };
this.writeHtml = function (value) { return new WriteHtml(value); };
this.setAttribute = function (name, value) { return new SetAttribute(name, value); };
function WriteText(value) {
this.execute = execute;
function execute() {
TemplateEngine.currentNode.text(value);
}
}
function WriteHtml(value) {
this.execute = execute;
function execute() {
TemplateEngine.currentNode.html(value);
}
}
function SetAttribute(name, value) {
this.execute = execute;
function execute() {
TemplateEngine.currentNode.attr(name, value);
}
}
}
TemplateEngineRunner = new function() {
this.run = run;
function run(controller) {
for (var key in controller) {
TemplateEngine.currentNode = $('#' + key);
controller[key].execute();
}
}
}

test.html

<!DOCTYPE html>
<html lang="ja">
<head>
   <meta charset="utf-8">
   <title>Template Engine Test</title>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<span id="test"></span>
<span id="testHtml"></span>
<span id="attr">test</span>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">google.load("jquery", "1.4.2");</script>
<script type="text/javascript" src="templateEngine.js"></script>
<script>
   var controller = {
       test: TemplateEngine.writeText('hoge<b>aaa</b>'),
       testHtml: TemplateEngine.writeHtml('<i>aaa</i>'),
       attr: TemplateEngine.setAttribute('style', 'font-weight: bold;')
   }
   
   TemplateEngineRunner.run(controller);
</script>
</body>
</html>

試してみると、Google AJAX APIを使ったためか、JSをロードして置換を始めるまで待ち時間がちょっとありますね。dummyといった文字列を出すのはあまりよくなさそうなので、普通に空欄にした方が良いと思いました。本当は、この程度のことならjQueryもいらないんですよね。

続く

新しい技術と信用と山とシステムと

学生時代登山をやっていて、社会人登山家の人とも知り合って一緒に訓練をさせてもらっりした。

その中である二人組の登山家がいた。年配の登山家と、30台半ばくらいの若手の登山家で、ともに海外登山を行う本格的な登山家だった。縁があって、一緒に雪山で訓練をさせてもらった。

その時、視界がホワイトアウトし、コンパスと地形図で場所を測定しながら、自分たちが来た道に目印として残した旗を探して歩いた。その時、年配の方の登山家が、残り3人のメンバーの観測に不満があったようで、自ら調べて、一人その道を歩いてしまった。と、言っても、数メートルなのだが、吹雪の中での数メートルは見えない。

さらに、その後雪も止んだので、斜面でザイル(ロープとも言う)の使い方を訓練することにした。ザイルの使い方も色々ある。まず大きく分けて「コンテ」と「スタカット」がある。前者は、隊員数名を一本のザイルで結んで、一人が滑落したら前後の人で止める。失敗したら全員滑落してしまうので危険だが、スピードが早い。例えるなら電車ごっこだ。後者は通常2名で行う。行動するのは常に1人ずつ。例えるなら尺取り虫である。安全だが遅い。ちなみに山でスピードは大事だ。行動は日没とのタイムトライアルなのだから。なぜこんな細かいことを説明するのかというと、より、臨場感を増すためなので理解いただきたい。本題には本当は関係ないのだが。

この時は「コンテ」のやり方について練習した。「コンテ」のやり方も色々である。伝統的な方法として僕が先輩から習っていたのは、ザイルを片手にぐるぐる巻きにして持ち、滑落を止めるときは、ぐるぐる巻きを地面に投げつけて中心にピッケルを刺すという方法だ。その時のメンバーでも、それがまず前提だったようなので、多分標準的な方法なのだ(筆者は確かに山岳部出身だが、それほど優秀な部員ではなかったので、それなりの理解しかないこともご了承ください) しかし、近年、色々な方法が研究されている。この時は「大阪府岳連方式」と、名前を忘れてしまったが海外の方で研究された方式を試した。なるほど、やってみると、ザイルの摩擦の使い方がこれらの方が優れている優れているかもしれない。より、クリティカルなシチュエーションでは、こういう新しい方式を使ったほうが望ましいだろう。が、問題があった。慣れていないことと、今まで当たり前のようにしてきた、人と人のあいだの距離の調整がこれら新しい方式ではできないのだ!(←本当にそうか不明。筆者ザイルワークの初心者)そこで、結局、年配のリーダー格の人は決定した。

新しい方法も確かに良いが、今回は、伝統的な方法を採用しよう

              • -

後日、若手の登山家の方から呼び出された。

「○○さんとは、あまり付き合わない方が良い」

そうはっきりと言われた。理由は、前述のように、彼は、「古いやり方を変えない」「自分の判断に固執して仲間と合わせない」という癖があるからとのことだ。他にも何度かそういった場面があったらしい。

「彼のようなやり方でも、国内で仲間を連れて登る分には問題ないかもしれない。でも、それで海外は通用しない

というようなことを言ったような気がする。

さて、このブログを読んでいるのは、プログラマー、システム屋の人が多いはずだ。対象を登山から普段の仕事に置き換えて考えてみよう。心当たりがないだろうか?最後の「海外(世界)で通用しない」という言葉の重みや如何に?

Mayaaで動的なidを作るw

Mayaa的には非推奨のはずで、マニュアルにも全然記載がないのだけど、どうしてもと顧客から要望があったので、次のように実装しました。

テンプレートにこのように書いたとします。

<span m:id="HOGEHOGE_NAME_OF_HOGEHOGE_ID" m:HOGEHOGE_ID="1">dummy</span>

で、実はHOGEHOGE_NAMEは、Map hogehoge に、HOGEHOGE_IDをキーとして与えられているとします。

public static Map<String, String> hogehoge = new HashMap<String, String>();
static {
hogehoge.put("1", "ほげほげ");
hogehoge.put("2", "ふがふが");
}

この場合、このようにすれば、m:HOGEHOGE_IDをキーにして「ほげほげ」等を返すidが作成できます。

<m:write m:id="HOGEHOGE_NAME_OF_HOGEHOGE_ID" value="${hogehoge.get(originalNode.getAttribute(
  Packages.org.seasar.mayaa.impl.engine.specification.SpecificationUtil.createQName("HOGEHOGE_ID")
).value)}" />

参考にさせていただいたのは次のML投稿です。
http://ml.seasar.org/archives/mayaa-user/2009-May/000793.html

本当は、Namespaceにmayaaの物を使わず自分でちゃんと定義するべきでしょう。

この使い方はMayaa作者が意図した範囲から外れていると思うので、今後のMayaaバージョンによってはサポートされなくなるリスクは0ではないでしょう。