l'essentiel est invisible pour les yeux

Wednesday, February 22, 2006

アルバイト1.0->2.0

社員1.0と2.0

面白いので自分に当てはめてみました。
社員ではないのでアルバイト1.0かアルバイト2.0か?いざチェック。













1.02.0
全ての情報源がCNETと日経新聞あたりだったりするBloglinesです。(新聞読んでないなぁ。。)
ブログの存在すら知らない。ブログは書き始めて2年です。
会社はヒエラルキーで、経営者が戦略を作ってくれると思っている。自分で作った方が楽しいと思います。
ミッション以外の仕事はやらない。決められたミッションの無い職場かな(笑
MTが葬式のように暗い。興味が無いと眠くなります・・
自分の評価や給料が低いと愚痴る。自分に対して愚痴ります。おい、俺駄目だぞみたいな
いつも何かを恐れている。何か恐れますか??
転職先は、MS, NetApp, Dellあたりを考えている。起業。
ハードウェアが好きだ。ソフトウェア系だけど、ハードウェアも結構好きです。
自分の成功体験に固執する昔話をよくする。まだまだ、成功体験を語れる身ではないですので日々精進。
目はいつも中を向いている。外を見ているのかなぁ


みなさんも試してみてください~。
就職活動中の友達にトラバしてみる。

Saturday, February 18, 2006

Drecom内藤社長にご飯に連れて行ってもらいました

(株)DRECOMが2月9日に東証マザーズに上場しました。

ドリコム内藤社長は上場企業の社長になりました。
そして、先日株式を600株を347万円の単価で売却し20億円の利益を得た事をニュースで知りました。

そんな中社長から「一度ご飯でも食べに行こう。」と声を掛けてもらって、昨日祇園の鹿六という焼肉店に連れて行ってもらいました。


内藤さんに初めて会ったのは、2003年4月大学一回生の新歓祭。
そこで出会ったのが、ドリコムの勧誘ビラでした。今では考えられない話ですが、社長とCTOの二人が丸一日、勧誘に費やしたそうです。

ビラには、ほぼ何も書かれていませんでした。「普通じゃものたりないあなた。いいバイトがあります。」そんな怪しげなメッセージだけだったと思います。このビラは今でも記念にとってあります。でも、何かを感じ取ったんですね。気づいたら書かれていたHPアドレスから会社のHPを調べて、採用のページから応募要項を調べてメールしていました。

でも、「当時本当に何もわからなかった」
C言語での文字列の扱い方もわからない。(高校で教えてくれなかった。。)
「#include もおまじないだ」と教えられていました。

本当に期待値だけでインターンとして採用をしてもらいました。

1ヶ月でC言語を覚え、2ヶ月目からはC++を勉強しました。一ヶ月終わったときに、「給料ください!」と社長に直々にメールを送ったときは「まだ最低時給800円分の働きはしていませんので、給料は払えません。」とメールを返してもらったのも今となっては懐かしい思い出です。二ヶ月目に再度同じメールを送り、給料をもらい始めました。
この世界で認めてもらいたい。そんなエネルギーにつき動かされていたのだと思います。

そして、3年半がたった今、ご飯に誘っていただきました。
「どうしても勧誘したい人」に対して社長がいいお店にご飯を食べに誘う「内藤マジック」として社内では有名です。そして、今はちょうど就職活動シーズンです。期待値だけでなく、能力を認めてもらっているのは非常にうれしいことだと思っています。

ドリコムのビジネス展開・社員の力を発揮させる組織作り・ライブドアショック
株のこと・Web2.0・ASPビジネス・・・と色々話してもらいました。

内藤さんと同じMTに参加し一緒に仕事が出来るのは、最初の一年ほどだけでした(東京進出が始まったので)。その一年で社長の頭の回転の速さ・負けず嫌いさ・エンターテイメントを作り出す心得・・・色々なことを学ばせてもらいました。

そして、「東京に来て自分の近く(経営より)で働いてほしい」と声をかけてもらいました。
ですが、最後は「rakutoの人生だしやりたいことをやりなよ」といってもらえたところに改めて、内藤さんの心の広さに感動しました。

昔、内藤社長から「自分の昔の姿と重なるなぁ」と言ってもらったことがあるのですが、だからこそ自由にやればいいよと言ってもらえたのかもしれません。


「優秀な経営者は6年ごとに現れている。」
「第一世代はソフトバンク孫社長、第二世代は楽天三木谷社長、ライブドア堀江(元)社長、サイバーエージェント藤田社長・T&G野尻社長」

「そして、第三世代がドリコム内藤社長」
ということも重なり、ドリコムが注目されていると聞きました。

どんな優秀な人であっても、運・時代が絶妙に重なり合わないと大きな成功はありえません。
また優秀な人というのは運を呼び込む力を持っている人だとも思っています。ドリコムがITで会社を興したことも、WEBが変わりPCだけのものでは無くなっていく2006年に上場したのも全てが最高のタイミングではないかと思います。(ライブドアショックをのぞけば。)


お世話になった恩返しをするためにも、頑張らなければならないと思っています。
そして、上場おめでとうございます。

あ、第四世代は2012年といえば・・26歳のとき(笑

Friday, February 17, 2006

[ActiveRecord Hacks] Dynamic Finder

ActiveRecord Hacks - Dynamic Finder

ActiveRecord Hacksでは、ActiveRecordの面白いメソッドを紹介しながら、どうやって実装しているのかをソースコードを見ながら検証してみます。

ActiveRecordにはDyanamiFinderという機能が実装されています。
(静的言語を主に使ってる人にとっては、これはもうマジックすね。)

Dyanamic Finderは、読んで文字のごとく動的なレコード検索機能を提供します。例えば、こんなスキーマがあったとします。

CREATE NOT IF EXIST TABLE drecoms(
id INT AUTO_INCREMENT,
name VARCHAR(50),
email VARCHAR(100),
);

例えば、「rakuto」という名前の社員を検索したいときに、self.findメソッドを使いますよね。

rakuto = Drecom.find(:all, :conditions => ["name = ?", "rakuto"])

Dynamic Finderの機能を使えば、次のように書くことが出来ます。

rakuto = Drecom.find_all_by_name("rakuto")

hoge@hoge.comというemailを持っている社員は次のように検索できます。
hoge = Drecom.find_by_email("hoge@hoge.com")

rakutoという名前で、hoge@hoge.comというメールアドレスを持つ社員ならば、
rakuto = Drecom.find_by_name_and_email('rakuto', 'hoge@hoge.com')


ヤバイっすねこの機能。
どういう仕組みで動作するのでしょう?もちろんfind_by_(カラム名)というメソッドがActiveRecord::Base内に実装されているわけではないことは一目瞭然です。
動的にカラムを条件として参照するためのメソッドを作り出しています。

このマジックの種明かしをするために、ActiveRecord::Baseのソースを追ってみます。

Drecom.find_by_(カラム名)というメソッドを呼び出したときに、宣言されていないので静的言語ならコンパイルエラーとかでアボーンですが、Rubyではmethod_missingメソッドが呼ばれます。

activerecord-1.13.2で言えば、970行目の"def method_missin(method_id, *arguments)"になります。

def method_missing(method_id, *arguments)
if match = /find_(all_by|by)_([_a-zA-Z]\w*)/.match(method_id.to_s)
finder = determine_finder(match)

attribute_names = extract_attribute_names_from_match(match)

super unless all_attributes_exists?(attribute_names)
conditions = construct_conditions_from_arguments(attribute_names, arguments)

コールされたメソッドが存在しない場合、メソッド名が"find_(all_by or by)_(アルファベット)"にマッチするかを調べます。determine_finderは、一致するカラム全て検索(find_all_by)なのか、一つだけ取り出すのか(find_by)を特定します。

次にextract_attribute_names_from_matchメソッドでメソッド名を"_and_"でsplitしてカラム名を配列として取り出し、メソッド名として指定されたカラムが全て存在するかどうかを調べています。

そして、"extract_attribute_names_from_match(match)"メソッドで"name = 'rakuto' AND email = 'hoge@hoge.com'"といったSQLの条件部分を作成します。

メソッドの振る舞いの実体は出来上がりました。残るはメソッドにリミットやオフセットなどのオプションの処理とベースのfindメソッドの呼び出しです。

if arguments[attribute_names.length].is_a?(Hash)
find(finder, { :conditions => conditions }.update(arguments[attribute_names.length]))
else
send("find_#{ finder}", conditions, *arguments[attribute_names.length..-1]) # deprecated API
end

もし、Drecom.find_by_name('rakuto', :limit => 10)といった感じでオプションが与えられている場合とそうでない場合で呼び出す基本のfindメソッドを切り替えています。

条件部分を作り出しているメソッドをもう少し詳しく見たいと思います。

def construct_conditions_from_arguments(attribute_names, arguments)
conditions = []
attribute_names.each_with_index { |name, idx| conditions << "#{table_\ name}.#{ connection.quote_column_name(name)} #{attribute_condition(arguments[idx\ ])} " } [ conditions.join(" AND "), *arguments[0...attribute_names.length] ] end

引数としてカラム名の配列と条件として指定した値('rakuto')を取ります。

それらをconditons配列にPUSHしてSQLインジェクション防止のためにプリペアドステートメントを適用します。返り値は、['name = ? AND emai = ?', ['rakuto', 'hoge@hoge.com']]といった感じです。


まとめ

強力で面白い機能ですが、インデクスの張り具合を理解していない厨房が使うと死にます。インデクスの張られていないカラムを検索条件としてばんばん検索をかけるはめに。

Tag:

Tuesday, February 14, 2006

立命館高校の長山先生が死亡事故に巻き込まれました。

事故:12台絡む玉突き、3人死亡 京滋バイパス

倫理の授業などでお世話になっていて、キャラクターも強烈で記憶残っている長山先生が交通事故に巻き込まれてお亡くなりになりました。

ショックです・・・ショックです。。
おつやが明日の18時から、
告別式が16日の10時からと聞きました。

理系倫理を取っていた人ならば、立命館高校の長山先生の倫理が他とは違うってみんな思っていたと思います。

普段生活をしているときは、「今を生きているという風」にすごしていますが、その今というのは過去の経験値の積み重ねの上にあるということを強く感じました。

長山先生の教えも自分にとって大きな経験値になっているのだなと、強く感じました。

長山先生ご本人が一番無念だったと思います。
ご冥福をお祈りいたします。

Sunday, February 05, 2006

ヨゴコーゲン・ヤップへGO!


ようやく、「趣味って何?」って聞かれたら胸張って「スノボーかな。」って言えるぐらいになったかな。

今年は、近場でも雪がいいので毎週末行っていて、今回は4回目。

滋賀で、最高と評判の高いヨゴコーゲン・ヤップに始めて行ってきた。HPもナウでヤングな感じに作られていて、イベントも色々アル様子。最大のイベントは2月18日に開催予定のヤップ・ナイト

余呉?滋賀の北の方だろう~と安易に考えていたのだけど、これが完全に舐めている。だってヤップの頂上から日本海が見える!滋賀というよりは、福井に近かった。

でも、でも!!
これが、結構お安くでいける。

バスツアーで参加。
土・日はスノーライナーというバスが、彦根・長浜などから出ていてリフト券こみで4200円!!
車持ってたら車で行ってもいいだろうけど、今回の帰りだけでも、結構大きな事故が2件起きていました。雪道慣れていない都会ものが運転するには厳しすぎる条件だし、バスは楽だしおすすめです。

何が「最高にいけてる」のか。

  1. 雪質が最高

  2. コースがいい。パーク・キッカーが充実

  3. 日本海が見える


雪質がとにかくイイ!
まさに、信州クラスの粉雪。積雪量も3メートルを超える。


コース設計がイイ!
全てのコースが同じ場所に滑り降りてくる。つまりコースの幅がとても広くて、リフトの乗り換えも簡単。
コースマップで見ると「うーんどうかな。。」って感じですが滑ってみると格別!
関 西はリフトの乗り場がばらばらで、コースの幅も狭い中でかなりいいコース設計です。さらにキッカー・パークも充実していて中級者で「トリックやキッカーで ジャンプ決めたいなぁ」(ちょうど、私レベル)と思ってる人にも多数の高さのキッカーがそろっておりチャレンジしやすくなってます。

アリエスBリフトを上がって右側に進み滑り降りおりていくとキッカーにチャレンジできる。
そして、アリエスDリフトを上って左側、ブレバンコース(いわゆる林間コース)にもなぜかキッカーが設置されている(笑
また一部コースの端が盛り上がってるので、パイプのように遊べます。


海が見える!
「今庄365もスキー場が見えたのかな?ジャム勝もみえるの?」ちょっと記憶が定かでないのだが、明確に覚えている限りでは、海がこんなに近くに見えるスキー場は初めて。

ウッ。。
着替え終わって、帰りに雪の斜面で滑ってひじから地面に落ちました。
久しぶりのきゃら肩です。(内輪ネタ)


言われている通り、確かにいけてるスキー場でした。
帰りのバスの中では、映画「ステルス」 を見て、「そうだ!これだった!ITで働きたかった理由は。」という原点を思い出した。それは、次の記事で。 Posted by Picasa

Friday, February 03, 2006

Thursday, February 02, 2006

UIE Japanの人達

ブログのリファラーをチェックしてたときに、今野さんのはてなRSSのUIEカテゴリからのアクセスが結構前から増えていたので、UIE Japanにはこの人たちが入るんだなと思っていた。

http://revilog.com/

http://tkido.blog43.fc2.com/

http://recordo.blogspot.com/

http://nirwana42.blogspot.com/

えっと、UIE中島さんの息子さんとぐらいと同世代ぐらいになります。
まだまだひよっこですが、皆様よろしくお願いします。

そろそろ就活について一言いっておくか

2月2日、UIE Japanが誕生した。
そして、ギークの集まるUIE Japanへの採用が決まった。

また、ゴールドマンサックスの面接合格通知が届いた。
一応次のプロセスも受けるが通っても多分いかないだろう。
~なんて言ったら文系の友達に怒られるだろうな。

Wednesday, February 01, 2006

Javascriptのライブラリリスト

A Huge List of Javascript Libraries

Javascript libraries roundup

jQueryは、まだリストにあがってないなぁ。

jQuery - PrototypeにインスパイアされたJavascriptライブラリ

AjaxインタフェースCMS

SkeletonzCMS

Skeltonzは、AjaxインタフェースのCMSです。シンプルなインタフェースで、操作性&拡張性は高そうです。また、ページの作成は、GUIのHTMLエディタというよりは、テキストエディタでWikiに近いシンタックスで行います。

  • Responsive and easy to user interface
    Much of the CMS‘s communication with the server is AJAX based. For you and your users this means fast, responsive and easy to use interface!

  • Insert and format with a very simple syntax
    Creating pages, uploading files or images is done by a wiki based syntax.

  • One-click backup of the whole site
    With just one click you can backup the whole site – and with one click you can restore that backup!

  • Easy to use template system
    The template system is VERY small, clean and extendable

  • Group and user management included
    Set premissions on pages – with a few clicks
  • 勝手に日本語訳
    ・扱いやすいユーザインタフェース
    ・Wikiベースのシンプルな構文でページを作成する
    ・ワンクリックでページ全体のバックアップが可能
    ・テンプレートを簡単に使用できる。
    ・ユーザ・グループの管理が可能
    (少しでも)慣れている人にとっては、(遅い)GUIよりも(軽くて速い)Wikiベースのユーザインタフェースが使いやすい。

    ライセンスとアーキテクト

    License :: GPL
    Programing Language :: Python 2.3
    Database :: SQLlite
    Fremework :: Cherrypy
    Template Engine :: Cheetah template
    Javascript Library :: Mochikit
    Database O/R Mapping :: SQLObject

    お、TurboGearsと似たような構成。ほぼ同じ。
    (Railsもいいですけど、TurboGearsもヨサゲなんですよ。マルチバイト文字あたりがなんとかなれば。。)

    ということでAjax部分の実装は、TurbGearsと同じ、Mochikitを使用しています。

    CMS編集ページのデモが用意されています。

    で、早速使ってみるがEdit Contentボタンをクリックしても永遠にView HTMLの横の読み込み中が回り続けてページの編集が出来ないのでやめ。

    Python周りのプロダクトの使い方の参考としてソースを読んでいくことにする。

    オープンソースのAjaxフレームワーク

    Plex

    Backbaseと近い系統のAjaxフレームワークである。

    これは、ぞくぞくさせられる。
    独自定義系?と表現されてもいたこの系のフレームワークを後で調べる。

    jQuery - PrototypeにインスパイアされたJavascriptライブラリ

    jQuery

    jQuery is designed to change the way that you write Javascript.

    jQueryはあなたのJavascriptプログラミングの方法に変化をもたらすように設計されている。

    というわけで、jQueryを使ったJavascriptプログラミングにチャレンジしてみよう。

    What is jQuery?
    jQuery is a Javascript library that takes this motto to heart: Writing Javascript code should be fun. jQuery acheives this goal by taking common, repetitive, tasks, stripping out all the unnecessary markup, and leaving them short, smart and understandable.

    jQueryは、「Javascriptプログラミングを楽しくするべきだ。」をマジメに考えるJavascriptライブラリだとさ。

    非常にコンパクトなライブラリでサイズは10kbほどで、コードリーディングもさほど辛くない。

    また、jQueryを使った、デモはこちらから見ることが出来ます。
    http://jquery.com/docs/Demos/


    jQueryのアーキテクト
    から構成される。

    jQueryBaseは、jQueryのコア部分である。DOM要素を取得する$()やイテレータ,イベントハンドラの登録関数などからる。
    BasicEffectsは、Effect(視覚効果)を与えるメソッドを実装している。
    Advanced Eventsは、イベントを扱うときに役に立つメソッドの実装である。


    jQueryBase

    jQueryでは、全てのプラグイン、基本の関数、セレクタでCVSXPathをサポートしている。
    PrototypeからインスパイアされているjQueryを語るには、$()メソッドを初めに説明するべきだろう。
    Prototpyeの$()とjQueryのそれは、動作が異なる。これについては、後の「PrototypeとjQuery」で説明したい。

    $() 関数

    全ての元になる大事な関数。DOM要素を参照する。
    jQuery の$()関数は、Prototypeの$()とは異なる。Prototypeでは、IDでDOMを参照するがjQueryではXpath, CSS, 独自の式でDOM要素を参照する。また、返り値はjQueryObjectで、これもPrototypeとは異なる。

    $()関数は、3つのシンタックスを取る。
    • $(EXPRESSION)
    • $(DOMElement)
    • $(..., Context)
    EXPRESSIONは、CSSとXpathからなるセレクタの式である。
    簡単な使用方法として、pタグの要素を全て取得する場合は次のように書く。
    $("p")
    $()は、jQUeryオブジェクトを返すので連鎖してメソッド呼び出しが可能である。
    $("p").addClass("test").show()
    デフォルトでは、$()関数は現在のHTMLドキュメントからDOM要素を検索する。
    DOM要素を指定して$()関数を通す事で、DOM要素をjQueryObjectとして取得でき、jQueryObject

    が持つ全てのメソッドが使用可能となる。
    $(document.getElementById("test")).onclick(...)
    $(document).onready(...)
    $(window).onload(...)
    $(xml.responseXML) // For working with XMLHTTPRequest

    $(...,Context)
    第二引数の、コンテキストはオプションで指定可能である。このパラメータを指定した場合、コ

    ンテキストの中からDOM要素の参照が行われる。つまり、下記の記法の速記法である。
    $(context).find(...)
    shorthand(速記法):
    $("p", document)
    $("title", xml.responseXML)

    Iteration

    size()
    要素数を返す。
    $("p").size()
    get(), get(N)
    DOM要素を配列で返す。Nが指定された場合は、N番目の要素が返される。
    $("p").get()
    each(function())
    全ての要素に対して関数を適用する。
    コード例:
    $("p").each(function(i){
    this.innerHTML = this + " is the Element, " +
    i + " is the Position";
    });

    BaseEvents

    クリック等のイベントに対するイベントハンドラの登録関数。

    bind(String,Function)
    Stringで指定したイベントに、Functionで指定した関数をバインドする。
    $("p").bind("click",function(){
    alert("Hello!");
    });
    p要素中のテキストをクリックすると、イベントハンドラとしてバインドされたalert("Hellow!")が起動する。

    unbind(String, Function)
    バインドした関数を解除する。


    DOM Modification

    DOM操作を提供するクラス。
    DOM要素へのinnerHTMLの編集・追加、要素の削除など。

    html(String)
    Stringで指定された内容をDOM要素に設定する。

    サンプル:
    $("p").html("This is html!");

    remove()
    選択されている要素を削除する。
    $("p").remove()

    append(String)

    append(DOMElement)
    append(Array)
    マッチした要素の最後に文字列や、DOM要素を追加する。
    $("p").append("Append text")

    prepend(...)

    before(...)
    after(...)
    マッチした要素の最初や最後に文字列やDOM要素を追加する。


    wrap(...)

    マッチした要素を引数で指定したHTMLでラップする。
    次の例は、pタグに一致する要素をpタグで囲む。
    $("p").wrap("wrap_text");


    Style Methods

    スタイルに関するメソッド。CSSを適用する。

    CSS(Key, Value)
    要素に対してスタイルを適用する。element.Key = Value;と同じ効果。
    サンプルコードは、全てのpタグの要素に対して"font: 14px Arial"を適用する。
    $("p").css("font","14px Arial");

    CSS(Hash)
    要素に対してスタイルを適用する。上の関数と違い、スタイル名:値のハッシュを指定する。
    サンプル:
    $("p").css({
    font:"14px Arial",
    border:"1px solid #000"
    });

    addClass(String)
    マッチしたクラスにCSSクラスを適用する。
    サンプル:
    $("p").addClass("even")

    removeClass(String)

    マッチした全てのクラスからCSSを削除する。
    $("p").addClass("even")

    BaseEffects
    視覚効果のためのメソッド。

    hide()
    マッチした要素を非表示にする。

    show()
    マッチした要素を表示する。

    toggle()
    マッチした全ての要素をトグルする。


    ここまでで、jQueryBaseの説明は終わりだが、視角効果の実装をもう少し補足する。

    fx

    jQuery中に実装予定のEffectsのためのライブラリである。

    PrototypeとJQuery
    この項が重要?
    結局、jQueryはPrototypeとどう違うのか?Prototypeの$()が拡張され、CSS+XPath + 独自の言語でDOMを参照するというのが、よさそうな印象を受ける。

    そして、JQueryは、Prototypeに非常にインスパイアーされています。
    $()メソッドなどは、同名だが動作が異なるため、Prototype.jsとJQueryを一緒に使用する場合は注意が必要である。

    1. PrototpyeとJQueryを共用する場合は、jquery.jsを後に読み込む必要がある。

    PrototypeとJQueryの挙動の違い

    $()関数の挙動の違い

    $("pre")
    Prototype: ドキュメント中からIDが"pre"の要素を探し、存在する場合はオブジェクトを返し、見つからない場合はnullを返す。
    JQuery: preタグの要素を探す。
    見つからない場合: "pre"というIDを持つ要素を探し、見つかればその要素を返す。見つからなければ、空のマッチした要素がセットされたJQueryオブジェクトが返される。
    見つかった場合: マッチした全てのpre要素からなるJQueryオブジェクトが返される。

    $(DOMELEMENT)
    DOM要素を直接指定するシンタックスである。

    Prototype: DOM要素を返す。
    JQuery: DOM要素をラップしたJQueryオブジェクトを返す。そのため、返り値はPrototype, JQueryで利用可能である。

    PrototypeとJQueryを共用する際のポイント
    PrototypeのbehaviorとJQueryは、異なるので次の二つの対策のうち一つをすることがお勧めである。
    1. あいまいなセレクタの禁止
    2. ID名にDOM要素のタイプ(HTMLタグ名など)を使用しない
    1番目について。
    IDでユニークなDOM要素を参照するときには、
    $("#pre")
    とコーディングする。
    $("pre")
    では、IDでユニークな要素を参照するのかpreタグの要素を参照するのかあいまいである。

    2番目について。
    Prototype記法を使用したい場合には、このID名の命名ルール「ID名としてDOM要素のタイプで現れる可能性のタグを使用しない。」を適用する解決策が考えられる。
    このルールは一つでもDOM要素のタイプとして存在するID名が使われた途端に破綻します。


    JObjectは、DOM要素のラップ

    先 程、「DOM要素をラップしたJQueryオブジェクトを返す。」と書いた。JQueryでは、PrototypeユーザとJQueryユーザの両方をサ ポートするように設計されている。従来のDOMオブジェクトのプロパティへのアクセスも残したまま、新規にJQueryのメソッドが追加されている。

    $("wrap").style.display = 'none';

    JQueryでもラップしたDOM要素を返すために上記の記法は有効である。
    だが、JQueryではこの書き方は推奨されない。
    $("#wrap").hide();
    安全のために、JQueryにより認可された機能と用語のみを使用すべきである。
    jQueryは、Prototypeの不足している部分を補ってくれている。
    また、Prototypeと共用して使用することも考慮している。CSS, XPathセレクタの独自定義の式は便利そうである。

    Tags: