Monthly Archives: 11月 2010

クライアントサイドHTMLテンプレートエンジンを作ろうとしてみる。

サーバーサイドテンプレートエンジンはMayaaが好きなんだけど、これからはクライアントサイドの時代ですね!でも、デザイナーさんは、JavaScriptアレルギーな方が多いので、デザイナーにJavaScriptを書かせるのも難しいし、かといって、UIプログラミングは大変なので、出来ればプログラマーの力を借りずにデザイナーさんの力でどんどん開発出来たほうが生産性が高いと思います。その方がフィードバックが早いですから。

そんなわけで、自分をモチベートするために、実験的に作ってみました。

<!DOCTYPE html>
<html lang="ja">
<head>
   <meta charset="utf-8">
   <title>TemplateSample</title>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<span id="test">dummy</span>
<script src="jquery-1.4.2.min.js"></script>
<!-- テンプレートエンジン部分(外部JS化) -->
<script>
   TemplateEngine = new function() {
       this.currentNode;
       this.writeText = writeText;
       
       function writeText(value) {
           return new WriteText(value);
       }
       
       function WriteText(value) {
           this.value = value;
           this.run = function() {
               TemplateEngine.currentNode.text(value);
           }
       }
   }
   
   TemplateEngineRunner = new function() {
       this.run = run;
       function run(data) {
           for (var key in data) {
               TemplateEngine.currentNode = $('#' + key);
               data[key].run();
           }
       }
   }
</sctipt>
<!-- テンプレートデータ部分(UIプログラマかデザイナが書く) -->
<script>
   var data = {
       test: TemplateEngine.writeText('hoge')
   }
</script>
<!-- 実行(JSONPのコールバック?) -->
<script> 
   TemplateEngineRunner.run(data);
</script>
</body>
</html>

これを実行すると、クライアントサイドで、dataに書いてある、mayaaで言うところのprocessorみたいなものが解釈されて、画面のHTMLを置換します。ソースが多いですが、ほんとどがフレームワーク部分なので、外部JSにして、デザイナーさんか、UIプログラマーが書くべきなのは以下の部分だけになります。

var data = {
test: TemplateEngine.writeText('hoge')
}

この、dataは、JSONPかなにかで非同期で取得できると良いかもしれません。
あと、思った以上にデザイナーさんは、JavaScriptが苦手でXMLが好きなので、JSONではなくXMLの方が好まれるのかもしれません。その場合、XMLをサーバーサイドでJSONに変換してあげるのがパフォーマンス的にも良いかもしれません。

まだまだ実験とすら言えないよちよち歩きのコードですが、この構成で、forとか実装できれば、それなりに使えるのではないかと夢見てみたりしてみます。

追記

上記コードをみて、「エッジなエンジニア」な方々は「JavaScriptはオブジェクトを保持するべき!こんな書き方じゃ最初の出力しか賄えないよ」って言われるかもしれないと考えました。しかし、そうではなくてこう考えればいいのです。

「UIは全部dataに帰着する」

dataを返すJSONに、dataと一緒にオブジェクトを返し、dataのプロパティをそれぞれのオブジェクトとリンクすれば良いのではないでしょうか?dataオブジェクトの変更は、随時画面に反映されるようにすれば、HTMLは単なる枠になり、UIはdataオブジェクトで全て操作できる。

プログラマーは、その向こうでオブジェクトなりを操作して、dataを仲介してプログラミングを行えばいいのです。dataというより、controllerですね。

そのこともあって、WriteTextがオブジェクトだったり工夫したつもりです。とはいえ、JavaScriptで壮大なことをやると概して(主にIEで)重くなるので、どこかで落しどころをつけなければいけないでしょう。

続く

鉄道好きとしておすすめの本

好きを突き進んでるなら、一押しの書の一つや二つはあるわけで、鉄道好きとしての僕のそれは、この本です。

とっておきの汽車旅―全国から選びぬいた24路線 (旅の森)

いつ買ったのか憶えていないのですが、繰り返し読んでいます。只見線も五能線もこの本を読んでから乗った気がするので、多分、高校生くらいの時でしょうね。

既に絶版で中古1円ですか。そうですか。もっと早く紹介しておけば良かったです。w

まあ、確かにガイド雑誌のシリーズものなのですが、中身のクォリティが只物ではないです。まず写真。鉄道好きなら分かるはず。各路線の冒頭では遠景からの車両を描写し、各ページでは乗客や鉄道職員の顔をクローズアップしているので、旅情を感じます。そして、記事がまたしびれます。例えばトップバッター「宗谷本線」を書いた、吉田耀子さん

 “究極に寂しい旅”、というヤツをしてみたい。
 そんな考えが浮かんだのは、年の暮れも押し迫ったある日のことだった。
 “冬”“寂しい”と来れば北帰行、と昔から相場が決まっている。札幌に帰省中だった私は、「最果ての地」稚内めざして宗谷本線を北上することにした。年の瀬に一人雑踏に背を向けて北をめざす。自分がまとうであろう孤独の影を思い、私はのイメージに陶然とした。
 12月30日の朝、札幌からL特急で旭川に向かった。ここまでが函館本線である。
 …………………………
 …………省略…………
 …………………………
 …………北上すると、名寄である。ここで稚内行きの各駅停車に乗り換えるのだ。
 これが実に、1両きりの、押しも押されもせぬ“ローカル線”なのである。この可愛らしい鈍行は180kmもの道のりを、一針一針縫い目を数えるように北上していくのだ。まるで、宗谷本線という1本の枝をノロノロ這い上がるカタツムリではないか。でっかいどお、北海道。

いきなり、肝を抜かれるようなこのテンション!書き手の吉田耀子とは何者なのかと思いました。

記事ではさらに、ハイテク機器携帯電話を使いこなすジイチャンが登場し、さらに、出発前にカメラマンから聞いた「ハンパじゃない」寒さを味わうために、抜海から南稚内までの一駅を歩くという暴挙に出るが、40分ほど歩いたところで、地元の人の親切で車に乗せてもらう。そして、

「究極の寂しさ」を求めて北へ向かえば向かうほど、そこからどんどん遠ざかっていくのを私は感じていた。

と締めくくっている。

どうです?今すぐ宗谷本線に乗って稚内に行きたくなったでしょ?そう思わない?

宗谷本線のようなエネルギーはこれきりですが、他の24路線も味があります。10年前の本なのでちょっと情報が古いですが、そこがまた良い!

この一冊を読んでいると、僕が高校生の頃所属していた「旅行研究部」という部活を思い出しました。実体は写真部や鉄道研究部やクイズ研究部がごった煮になって、各々勝手に旅行記を書いて、年に数回冊子を校内に配っていたのですが、とても楽しい思い出でした。高校生のアマチュア活動とプロの活動を比較するなんて失礼もいいところですが、この本はその活動のお手本のようだと思います。きっと企画から出版されるまで大変な道程を経て世に出てきたのでしょう。しかし、楽しそうだなと思ってしまいます。

是非図書館で見つけたら、読んでみてください。オススメです。あるいはAmazonで1円で買ってみるとか(^^)

プログラマーとデザイナーの境界が縮まってきた気がする

今日のひがさんのエントリを読んで、appengineとは全然関係ないけど思ったことを書きます。
http://d.hatena.ne.jp/higayasuo/20101109/1289290143

ひがさんのエントリでは、appengine/Javaのスピンアップ問題を解決するために、静的HTMLをレスポンスして、JavaScriptで後から動的なデータを取得するパターンが提案されています。

別にこれ、appengineに限らず最近僕の近辺ではトレンドだなと思っていました。
SEOがあるので、サーバーサイドテンプレートもまだ必要だとは思いますが。

それで、思ったのがプログラマーの仕事についてです。僕が見てきたことを書きます。

むかしはJSPを書くだけのプログラマーがいました。

むかしむかし、ウェブシステムの画面はJSPという難解な呪文を駆使しなければ書けない、とても高級なものでした。
しかし、世の中には、「JSPが書ける」プログラマーが沢山いました。少しコツを教えればすぐにやり方を覚えてくれるので、派遣さんや学生のアルバイトが多く担当しました。

彼らは、デザイナーさんが書いたHTMLを「HTMLきもーい」とか言いながら、一生懸命コピペしていました。

この仕事は誰でもできる反面、誰がやっても同じくらいのコストがかかる仕事でした。優秀なプログラマーなら、普通のプログラマーの20倍は生産するのが普通な現場ですが、みんな一律に同じ程度の時間がかかるのです。それに、デザインを組み込むために何週間もかかるため、お客様にもご迷惑がかかりました。

それを解決したのが、(弊社の場合は)Mayaaでした。最初の導入は大変でしたが、導入後は、デザイナーの人が一人でサイト全体のデザインをしてくれるようになりました。もう、JSPを書けるだけのプログラマーは必要なくなり、プログラマーはJavaに専念し、デザイナーはHTMLに専念することができるようになりました。時々、中間言語のmayaaファイル(XML)を書かなければいけないのですが、こういう時、プログラマーは腕の見せ所でカッコ良く対応してあげるとデザイナーさんからの株が上がります。大いにがんばりましょう。

ところが、これを導入してたった半年で時代は変わりました。

みんな、JavaScriptでなんとかしたくなっていたのです。
MayaaはJavaScriptの変数を置換することはできません。強引にやることもできますが、やるべきではありません。セキュリティー的に。
それではどうするのかというと、一旦mayaaでspanタグにデータを落として、スタイルシートで非表示にし、JavaScriptから、getElementByIdしてinnerHTMLなどで値を取得するという方法が良さそうです。

これくらいのことなら、デザイナーさんにレクチャーすればやってもらえるのですが、

デザイナーといえど、JavaScriptを知らなければやっていられない時代なんだなと思います。

このことにとどまらず、今、毎日のように、デザイナーさんがいろんなJavaScriptをWEBから見つけては、「動かない」と悩んで僕に質問をします。その都度、「これはjQueryのバージョンが合わない」とか「このJavaScriptわかってない人が書いてるから使わない方が良い」とか答えるのですが、時には「わかった。僕がやっとくよ」ということもあります。

今までは、
Java, JSP, HTML(CSS)
と、それぞれの言語で話していたことが、今は
HTML/JavaScript
という共通の言語でプログラマーとデザイナーが会話をしているのです。

本当はUIプログラマーという職種が、橋渡しを担当するのでしょうか?でも、なんだかむしろ、今時のWebはUIを取ってしまったらあとは何も残らないくらいUIに依存しているので、UIプログラミングのできないプログラマーも、JavaScriptの書けないデザイナーもあんまり活躍できないのではないかと思います。

その後の追記

ついに、デザイナーさんから、「私ができそうなところは私がmayaa書いていいですか?」と言われました。もはや最強!

プログラマーに取ってmayaaファイルを書く事はXMLプログラミングですので、割と苦痛なのですが、デザイナーさんにとっては、JavaScriptよりもフレンドリーのようです。

この記事は以前多くのブックマーク・コメントを頂きました。

これからブックマークされる方はこちら↓