トップ «前の日記(2006-06-11) 最新 次の日記(2006-06-13)» 編集

日々の破片

著作一覧

2006-06-12

_ 日本Rubyカンファレンス2006

終わってしまえばあっというまの2日間だったけど、スタッフの皆様、お疲れ様でした。

#初日のカンファレンス会場から懇親会会場への通り道の要所要所にまで道案内のスタッフが居るのにはびっくりした。どうもありがとうございました。

_ 本物のプログラマーはB5ノートは使わない

なんといっても印象的だったのは、中田さんと中村さんのハックぶりだったり。そこにわたなべさんとakrさんとmputさんがからみながらminirubyが作れる状態からテストに通る状態へ持っていくわけで。で、わかったことは本物のハッカーはPC工房の黒テカリするでっかなノートPCを使うということ。やっぱりB5ノートみたいなちゃちなのじゃだめなんだろうな(という印象$鮗韻拭法靴泙辰拭命燭鮖辰討Ⅳ韻侘匹㎠辰拭

テンプレートとエンジン(essaさんのセッションの肝の部分とそれから考えたこと)

テンプレート中心主義では、データによってドリブンされる。

エンジン中心主義では、データはドリブンされる対象に過ぎない。

言い方を変えると前者は(穴埋め問題)、後者はオペレータである。

テンプレート中心主義では、具体的には、<%= foo %> のfoo重要なので、テンプレートエンジンにできることは、それを言われたとおりに埋め込むことだけだ。

たとえば、foo = params[:item][:name] と書いて<%= foo %>とくれば、そこにはparams[:item][:name]の内容が入る。それ以外のものは入れようがない。

ところが、エンジン中心主義では、<span id="foo">と来た場合、spanの中がテキストであることをエンジンは知っている。知っているからfooの内容をテキスト化できる。プログラマは余分なことをせずに、出力したいオブジェクトをそのまま突っ込めば良い。コンテキストにあわせて変形するのはエンジンの役割である。

正しい。

気になったのは、でもそれではエンジンは永遠に完成しないんじゃないかということ。まずタグは増え続けるだろう(少なくても増えてもおかしくはない)。オペレータの追加にどう追従するかというのがまず問題に見える。属性についても同じだ。特に属性について気になる。style属性のような方法のほうが良いのではなかろうか。たとえばAオペレータについてはLINKという属性値を与えられるようにしていたが、あれではHTMLの構文と別にそのオペレータと2重に覚える必要があるように見える。問題は、その属性を生では書かせたくはないということだ。となれば、デザイン時の属性と実行時の属性を同名で共存させるべきではなかろうか?

たとえば、

<A href="http://example.com/foo" title="fou is an enemy" runtime="id: :real_id; name: :real_name; href: @link; title: @title">

というように、テンプレート上に書かれた属性を実行時にはruntime属性に記述された名前/値ペアでオーバーライドするという方法だ。この場合、@linkはエンコード不可、@titleはエンコード必須という差がある。しかしそれについては、エンジンに容易にパッチが可能なようにテーブルを持てば済むはずだ。たとえば{ :A => { :href => false, :title => true } …… (正確には、falseのものだけを定義すれば良く、デフォルトは常にエンコーディングするで良いはず)。

次に、それが属性値かテキスト要素かの区別というものがある。その場合はelementというようなキーワードを利用すればよいかな?

<INPUT id="foo" type="button" value="push me" runtime="value: @button_title"> という場合のvalueと、<textarea id="foo" runtime="element: @default_content;">という場合のelement。しかし、elementはここではエンコードしてはならないが、<A id="foo" runtime="href: @link; element: @link_for_display">の場合のelementはエンコードが必要だ。これについてもデフォルトはエンコードするということにすればよいのかも。でもまて、spanの場合は、elementではなくvalueとして書きたいのではないか? とか。でもHTMLの記法は知っている前提なら、タグの子要素はelementというキーワードを利用するという規約でいいじゃん。つまりvalueはinputオペレータでしか利用しないということでどうだろうか? とか。

さらにスタイルシートと同様な手法で置換定義の外部ファイルへの切り出しも可能だ。

<div id="temporary_id" class="foo_div" runtime_class="foo_div">

で、rcdファイル(runtime class definition)に、foo_div { id : :real_id; onclick: "$('X').foo(); $('Y').bar();" ... } とか。

Webブラウザーは未知の属性runtimeを表示時に解釈しない。したがって、テンプレートの見た目はデザイン時と実行時で一致する(行数や字数の差による変化を除く)。

ただS2JSFのように同様にデザイン時と実行時の表示の一致を目指すテンプレートが結果的に思ったほど効果的ではないのは、現実にはパーシャルHTMLとしての利用が主で一枚ペラものHTMLは無いということだ。パーシャルHTMLをデザイン時にうまく組み合わせるための仕組みは別に考えなければならない。IEならbehaviourを使えばどうにかなるような気が今、一瞬したが、汎用性には欠けるな。JavaScript+XMLHttpRequestでパーシャルHTMLを自分のページ上に組み合わせるような仕組みを用意することは可能かも。

_ IDEとメソッド誘導

よく使うメソッドは先頭文字をaからfまでにまとめる。長さはどうでも良い。

絶対に使ってほしくないメソッドは先頭文字をzから始める。

後からの改善のためにa〜cは最初は使わない。

アルファベットの組み合わせに意味は不要(IDEがメソッド一覧とともにヘルプメッセージを表示する。日本語のヘルプが出ているのに誰がアルファベットのメソッド名を見るというのだ)。

最初:file_read(name, mode) → modeは基本的にrbが多い → メソッド名としてa0を割り当て。

File. ここまで打つと先頭に「a0:バイナリーモードでファイルを読み込んだ結果のバイト配列を返す」と出るのでEnterを押す。すぐ下には「a1:テキストモードでファイルを読み込み行単位の文字列配列を返す」と表示されている。

基本的に、.とカーソルキー0から1回とEnterキーで呼び出せる。

#無料のコンパイラと高価なIDEの両方を提供する。メソッド名そのものに有意味な名前はなく、意味はヘルプファイル上に存在するため、まともに利用しようとするとIDEの購入は必要。がんばれば無料コンパイラと使いにくいオンラインヘルプでもプログラム可能というエクスキューズ付き。

#長さとか名前はともかく、実際問題としてアルファベット順はばかばかしく重要ですな。と昨日からcollect!派のおれ(これはどうでも良いけど)は思った。実際、ヘルプメッセージまで出すIDEの場合、a〜fにめったに使わないメソッドが並ぶより、たとえば名前がa0、a1、a2であっても利用頻度が高いメソッドが並んでいるほうが重要。

#というか、ソートするのではなく使ってほしい+良く使われると推測可能な順序で表示すれば良いわけだが。

#どうでも良いことばかり思いつくのだが、するとソースにはFile.a0とか残っているだけなので、これでは後から修正できないだろうとか言い出す貧者のともしびが出現するのは目に見えている。しかし、なんのことはなく、IDEがヘルプメッセージを属性としてソースへ埋め込むから問題ないわけだ。

b = File.a0$バイナリーモードでファイルを読み込んだ結果のバイト配列を返す$

(属性の埋め込みに$を使うとか勝手に決めたわけだが)

これって、昔々の毎行コメントだな。したがって、昔の人のウケもばっちり。

_ メモ

http://www.codeguru.com/csharp/.net/net_general/article.php/c4671/

http://www.codeguru.com/Cpp/COM-Tech/atl/misc/article.php/c3619

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwebgen/html/bho.asp

本日のツッコミ(全6件) [ツッコミを入れる]
_ Kazz (2006-06-12 07:58)

昔、VB(だったかな?)の開発をしていた頃、フレームワークの奔りで作ったラィブラリィは、プログラマにあまり触らせたくないファンクションはプレフィクスに"zu_"、更に触らせたくないファンクションには"zz_"とか、名前を付けていたことを思い出しました。単にVBのドロップダウンの最後に列挙されるのを期待しただけなんですが、思いの外効果的でしたね。

_ arton (2006-06-12 10:59)

>思いの外効果的<br>おお、やっぱり。その意味で.NETのクラスあたりのメソッド数の多さとソート順表示って何かが間違ってますよね。

_ mumurik (2006-06-12 21:51)

ASP.NETだとWebControlのアトリビュートで自分自身のパースの仕方を指定する事で、ASP.NET自身はタグの中を知らなくても問題ありません。<br><br>その路線で行くとelementのattribute(同じattributeでややこしいですね、こちらはHTMLの方です)でconvertするクラス名(かオブジェクトの入った変数名かな?)を指定するんじゃないですかね?<br><br>そうすればエンジンはいじらずに拡張可能になる気がする。<br>(というjsのライブラリを以前作ろうとしてたけど面倒になってXAMLを待つ事にした)

_ arton (2006-06-12 23:54)

確かに属性にクラス名を入れるという方法も取れますね。<br>ただ、ここで言及しているamritaというテンプレートエンジンだとidでプログラムとhtmlをリンクさせているので特殊な属性が出てきているように見えたので、上のような書き方になっています。<br>僕が実装するならコマンドパターンを利用して、エンジンの既定動作用(span、div、liとか)+特殊な処理が必要なもの(たぶん、imgとaとscript、formあたり)+ユーザーが独自定義した拡張の3種類を要素名で分けるのがきれいかな、と思います。この場合、属性にクラス名を入れても良いかも知れないけど、あまり余分なものを指定/覚えさせたくない(と書いて気づいたけど、ここではテキストエディターで編集するのが前提で、コンポーネントのドラッグ&ドロップするわけじゃないので打ち込み量は減らしたい、余分なコマンドを覚えさせたくないというのは重要な点です)ので要素名とコマンド(といってもクラスになるわけだけど)を一致させるのが良いと思います。もっとも1対1になるわけではなくエンジン提供の汎用クラスが相当多数の要素を処理できるはずです。<br>運用的にはコマンドの追加は設定ファイルでもできるし、要素名をクラス名に一致させてrequireできたらそれに制御を与えるとかできるので、エンジンはいずれにしろそれほどいじらずに済みますね。

_ mumurik (2006-06-13 10:14)

ふむ、元のテンプレートエンジン知らずに適当にコメントしたのではずしてしまったようで。<br><br>htmlをパースする気があれば独自要素名でもOKですね。

_ arton (2006-06-13 12:54)

ああ、なるほど。>htmlのパース<br>それは確かにいきなりは考えませんね。<br>ここで言及しているエンジンの場合は、自力でDOM(作成時でもDOMと言ってよいのかな?)を作るタイプなので(それがオペレータ云々につながるのだと思います)、それは前提だったりします。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|12|

ジェズイットを見習え