2006年 03月 30日

XML と YAML

なんか YAML の話とか読むと、ことごとく XML が比較されて貶されてて寂しい。

確かに XML ってちゃんと書かないと読みにくいし、名前空間とか意味不明だし、DOM とか面倒くさい。

全ての XMLYAML に置き換えられる的に書かれた YAML の紹介とかもあったりして、なんかアレだなぁって思った。例えば HTML より、YAML のほうが断然書きやすいとか、それは違うよって思った。いやそもそも HTMLXML じゃないからこの話にはあんまり関係ないんだけど。

というかどうも、YAMLXML を比べるのに違和感を感じて仕方がない。なんかうまく言葉に出来ないんだけど、用途が違うんだよなぁ……とはいえ用途が違う、YAML のほうが向いている分野に XML が使われている (例えば SOAP とか XML-RPC とか、そこらの設定ファイルとか) からこういう話になるんだろうけどさ……

だからといって XML は悪い!みたいな勘違いを見たくないよ……なぜなら俺は XML さんが好きだから!

適所適材てのをちゃんと考えたい。まぁ設定ファイルに XML なんて面倒くさすぎてやらないんだけど(w

2005年 11月 09日

GreaseMonkey スクリプトのデバッグが激しく面倒くさい

はてなの入力欄で動く xml-modeそれのナロー化 css-mode

バグバグだけどなんか今日はもうやる気しない。留年しそうなんだもん。一個単位数え間違えてた。これから軽く必死こいても、あがれる確立20%ぐらい。はぁーうまくいかない。

  • インデントしないエリアにバグ。閉じた直後の RET がおかしい。いままでずっと CDATA で囲ってたから気付かなかった。
  • css-mode の開き括弧直後の RET がおかしい。
  • 補完リストの位置がおかしい。offsetLeft がおかしいのか?
  • はてなのエリアだと右下の広げるやつを一回やっとかないと横に伸びる。はてなの JS とのコンフリクト

物好きの方がいたらどうぞ。eta.user.js

余計なことしなくていいよモード (謎) は M-x c RET

2005年 11月 08日

ruby-xslt 0.9.1

ちゃんとエラークラス吐くバージョンがリリース。kiyoya さんのパッチ。

ruby extconf.rb --enable-error-handler して Makefile 作成。ちゃんと exslt もリンクさせるため、OBJS に /lib/libxml2.dll.a /lib/libexslt.dll.a /lib/libxslt.dll.a を追加。なんか知らんけど明示的に指定しないとリンクされなくて ld が怒る@cygwin (このバージョンに限らず)

XML::XSLT::XSLTError と、そのサブクラス XML::XSLT::ParsingError, XML::XSLT::TransformationError が追加される。変換用 XML ファイルのエラーなのか、XSLT ファイルのエラーなのかはわからなく。そのかわりエラー発生のタイミングが変わった。serve 時ではなく、xml= のときに出るようになった。だから問題ない。

エラーの message の意味がないっぽいので、--enable-error-handler 時には rb_raise 第2引数を STR2CSTR(rb_ary_to_s(rb_cvar_get(cXSLT, rb_intern("@@errors")))) とかにしたほうがいい感じ。--enable-error-handler は errors が定義されるのがキモイけど俺はそんなに気にならない。

第二引数を変えるだけだと以下のコードがダメ。

xslt = XML::XSLT.new()
xslt2 = XML::XSLT.new()
begin
xslt.xml = File.read("examples/fuzface.xml")
xslt.xsl = File.read("examples/fuzface.xsl")
out = xslt.serve()
print out;
rescue XML::XSLT::XSLTError => e
p XML::XSLT.class_eval("@@errors") #=> (1)
p e.message #=> (2)
end
p XML::XSLT.class_eval("@@errors") #=> (3)
begin
xslt2.xml = File.read("examples/fuzface.xml")
xslt2.xsl = File.read("examples/fuzface.xsl")
out = xslt2.serve()
print out;
rescue XML::XSLT::XSLTError => e
p e.message  #=> (4)
end

(3) で (2) のときと同じ (4) のとき前のエラーメッセージが紛れ込む。クラス変数使ってるからだろうけど、単純にインスタンス変数にしないのにはなんか理由があるんだろうからとりあえずそのままにして、

void xslt_raise(VALUE cError) {
#ifdef USE_ERROR_HANDLER
VALUE errors = rb_cvar_get(cXSLT, rb_intern("@@errors"));
VALUE error_str = rb_ary_to_s(errors);
rb_ary_clear(errors);
rb_raise(cError, STR2CSTR(error_str));
return;
#endif
rb_raise(cError, "");
}

とか作って経由させ、リセットさせてみる。XML::XSLT.errors は常に空の配列が返るようになって無意味になる。

ruby-xslt.0.9.1.error_message.patch

スレッドの切り替えってどういうタイミングなんだろう。

2005年 10月 24日

Ruby で XML をまじめに使いたい

標準添付の rexml は軽くやるぐらいなら十分だけど、名前空間関係がちょっと怪しい。今時 XML を真面目に使えないとなるとやばい。

RAA を検索してみると libxml-ruby がよさげなので試してみる。extconf.rb がなんだかしらんが全く通らないので該当部分でばっさりコメントアウト。extconf.rb の存在意義なし!!!

リファレンスの類が見当たらない。要素は ele = XML::Node.new(element_name[, content]) で作るみたい。便利だけど Node っていう名前にちょっと違和感が……属性は ele["attr_name"] = attr_valueDOM 実装を期待してたんだけど違うらしい。getElementsByTagName は Node#find みたいだし (find の引数は XPath なので全然違うが) あーやばい。コンテキストノードとカレントノードの違いを忘れそうだった。Node#find はトップレベルのコンテキストノードにレシーバを設定して云々、でいいのかな。カレントノードが XSLT のものだよなぁ。

名前空間関連はまだ調べてない。libxml だから大丈夫だと思う(てきとう。とりあえず学校へ。眠いっつうの。

2005年 07月 10日

XML Master ツレ受験オフ

いくつかの感想はおそらく今書くと危険 (謎) なので、簡単なところを書いておけば、受けた人は全員合格していたし、みんなやる気があるのかないのか謎なてけとー状態だった。バナナのおかげよ?

試験問題は同じ日付・会場でも別の問題がでるようだった。出題頻度がかなり高いのは XML Schema。次に XSLTDTD と続く感じ? 終わるまで今何問中何問目をやっているかがどこに表示されているかわからなくてだいぶ時間を気にした……けど普通にやると2回全問やるぐらいの時間がある。

最終的に俺がいいてぇのは試験料がたけぇってことだよ!

XML Master についてもう少し書く。

複数選択可能な問題はチェックボックス、一つ選ぶ問題はラヂオボタンになっているのでぼーっとしてても選択し忘れは少ないと思う。ただ回答の部分が全てクリック対象になっちょる (<label><input type="checkbox" />DTD なんていらない</label> みたいに) のがちょっとやりにくい。「次へ」をクリックしようとして D を選択してしまうとかが怖い。

あと「資料」は常に手前表示にして欲しい……いちいち開くのがだるかった。しかも問題がホイールでスクロールできないし。使いにくい。

XPath の問題で、かなりカスな問題があった。5つの選択肢のうち、問題文の条件にあった3つを選べとかいうのだったけど、その5つのうち2つはそもそも XPath としてパースエラーなため「問題文の条件」の意味がない。ある意味ひっかけ?

眠いナ。そして学内 IRC を諦める。

SoftEther で HTTPS 偽装接続すれば抜けれるぜウヘヘヘ、とか聞いたのでごちゃっていたけど、そもそも学校の PC の管理者権限なんぞもっていないのでクライアントがインスコできないのでした。ノートをもっていくにしても活動する範囲に無線LANのアクセスポイントがない。ついでに無線LANカードもってない。

不自由ないんたーねっと!!

2005年 07月 07日

CDATA セクション内に ]]>

Studying XML -- second step -- [ エスケープ ] (via XML の CDATA 中では ]]> のエスケープが必要)で ]]> を書くときは ]]&gt; のようにエスケープすればよいみたいなことが書かれているけど、CDATA セクション内ではそもそも & の扱いもなくなる (CDATA セクション内では ]]> のみがマークアップとして扱われる。Within a CDATA section, only the CDEnd string is recognized as markup) ので意図した挙動 (]]> がアンエスケープ) にならない。

結論をいうと CDATA セクションに ]]> をそのまま含めることは不可能で、どうしても CDATA セクションを書きたいよぅって時は二つにわけないとダメ。すなわち <!CDATA[[]]]]><CDATA[[>]]> とするしかない。

2005年 07月 03日

リハビリと ruby-xslt

ruby-xslt 使うと XSLT から Ruby のメソッドを呼べるみたいなので、とても使ってみたい。(何をするか、はともかく)

ただ、ちょっと実装が残念な形。

class XML::XSLT
def round_trip( arg )
arg
end
def type( arg )
arg.class.to_s
end
end
xslt = XML::XSLT.new()
xslt.xsl = "functions.xsl"
xslt.xml = "test.xml"
xslt.extFunction("roundTrip", "http://test.none", xslt, "round_trip")
xslt.extFunction("type", "http://test.none", xslt, "type")

俺としては Proc オブジェクトとか、ブロックを直接渡したい。すなわち次のように

xslt.extFunction("roundTrip", "http://test.none/", xslt) do |arg|
arg
end
#または
round_trip = lambda {|arg| arg}
xslt.extFunction("roundTrip", "http://test.none", xslt, round_trip)
# あるいはまとめたクラス / インスタンスを登録する形。
# もとのヤツに似ているけど名前が衝突しない。
class XSLTFunctions
def round_trip(arg)
arg
end
def type(arg)
arg.class.to_s
end
end
xslt.set_ext_functions("http://test.none", XSLTFunctions) # XSLTFunctions.new
# この場合 XSLT から呼ぶ関数名は Ruby でのメソッド名と同じになる。とか。
# やはり Ruby は書いていて気持ちいい。

ちょっとどうでもいいけど、なんかこの PC 描画がおかしい。温度のせい?

再起動したらなおった? ちょっと時間おかないと分からない。

限りなく不安定な PC だ。グラフィックボードにもファンがついているから、グラフィックボードが暑くて困っているのかもしれない。しかしゲームのとき気にならない (or 症状が出ていない?) のはなぜだろう。最も影響うけやすそうなんだけど。

2005年 06月 13日

XML Master 受験オフ

別にほら XML Master のまわしもんじゃないですよ?

詳しくは哀さんが、『XML マスター』受験オフ会のお誘い~2005 年初夏~ とか書いてます。

いやこれここ数ヶ月 XML っていったら日記書くときしか使ってないよっていう。やばいね。やばい。

あとは #XSLT @ IRCNet あたりをてけとーに眺めると分かるのかな。知らない。

2005年 03月 07日

XMLHttpRequest

XMLHttpRequest 使ってなんかしたい。でも特に思いつかない。難しいのはやりたくない。