2004/11/22(月)REXMLの速度をどう見るか

WEBの動的生成でREXMLはなかなか厳しいものがあるようだ。

REXMLを色々いじってみたが相当遅い。XML文書のパースにもそこそこ時間がかかるのだが、それ以上にXPathを使った関数を書くと、まあ遅いこと遅いこと。

"/foo/bar"のような簡単なものでも100ループで2秒、複雑なものを書いてコレクションで取ってこようとすると1発0.3~0.5秒くらいかかるようだ。ピュアRubyの限界か……

さて、妥協案だが単体ノードを取ってくるのにXPathを使わないってのが1つ。

REXML::Elements#[index, name=nil]
REXML::Elements#[xpath]

APIをみると、単体ノードを取ってくるのに上記2通りの書き方がある。上の方は用途が限定的になるものの、下よりも100倍以上速い。しかし上の書き方に限定するなら、いっそcsvでやれという気もする……

コレクションを取ってくる場合も、elements.eachとせずに上の書き方でwhileループを使えば若干の速度向上が見られる。とはいえソースは汚くなる。

ソート部などに下の書き方があったので、全部上になおしたところ130件程度のデータで、13sec -> 7sec程度の速度向上。まだちょっと厳しいが……

とりあえず、当初の構想はどんどん曲げよう。

2004/11/17(水)rexml仕様メモ

(? XPathの仕様を読んだ限りでは、以下は通りそうなんだが)
↑友人からの指摘で仕様書読み直してみましたが、ノードテストのところに(|)は書けなさそう?、文法能力低いのでちゃんとは分からない。

rexmlにおいては、

"/data/(software|category)"

は望み通りの結果を与えない。"/data/*"と同じ集合がかえってくるようだ。他にも幾通りか試したが、rexmlでは(|)が使えない気配。

この場合、
"/data/*[name()='software' or name()='category']"

とすることでsoftwareとcategoryの集合がかえってくる。当たり前だが、name()をnameとすると全く違う意味になるので気をつけろ! うーん、なんか間違えてるんだろうか。

2004/11/15(月)DOM? DHTML? in Mozilla? IE?

DOMに従ってればほぼどのブラウザでも動くという話は分かったけれども、今ひとつ納得いかないのは、タグ内のテキストへのアクセス。

innerHTMLだけはGeckoで通るようだが…… 将来消されそうな。
↓而して、これはスマートな方法か!?

span_el.childNodes[0].nodeValue = "a brand new bag";

childNodes[0]がものすごく気になる…… それ以外のアクセス方法はちょっと調べただけだと分からなかった。まあいくら何でももっとちゃんとした方法があるんだろうけど。

なんだかんだいって、(inner|outer) + (HTML|Text)はあると楽。無いと困るかどうかは???

あとはとりあえず、childNodes(0)はだめだってことをしっとくべきか。[]でないとIE:OK, Gecko:NGになる。

childnodes[0]は共にNG。大文字小文字キニシナイ文化圏の人間なのできつい。

idから書き始めるのはどちらも通るのだね。

test

は共にOK。WEBの資料はよく分からぬ。やっぱ本買わないとダメかも。

<参考>
DOM in mozilla - http://www.mozilla-japan.org/docs/web-developer/upgrade_2.html#dom
IE専ならえらく使えるが嘘多し - http://tomizawa-web.hp.infoseek.co.jp/dom.htm
IE v.s. N6なら結局ここか - http://tohoho.wakusei.ne.jp/js/dom.htm

あたもう、わかりませんずら。一度ちゃんとHTMLの書き方を覚えた方が良いな。めんどいけど。

2004/11/14(日)Ruby開発環境

注:あらかじめ。この記事には多分の嘘と誤解と無知が含まれていることをお詫びします。ともあれ、使いやすい機能というのは標準装備、アクセスが容易であるに限るというのは持論。

・RDE
日本人がRubyの開発をするということに限れば、最有力候補。他の開発環境で出来る機能はほぼ完備。しかしUTF-8の解析が怪しく、しかも対処法無いっぽい。今回のには不適。イマイチ補完機能が働いてない?
更新が半年以上止まっていて将来性も不安。アドレス違反がしょっちゅう起こるので怖い。

・Eclipse + RDT
ちゃんと動いてない? 組み込みクラスの補完機能が無いのか働いていないのか。自分の環境が悪い可能性大だが、ドキュメントがないので今ひとつ。これも半年以上更新が止まっている。機能的には多分RDEよりしょぼい。

・xyzzy + Ruby-mode
lispわかりません。xyzzyもわかりません。以上。

・sakura + Ruby
結局ここか! えーと、sakuraはプログラマユーザが少ないためにスクリプト言語のキーワードファイルがイマイチ整備されていない。一応Rubyの強調表示はあるが制御構造と、関数定義部くらい。でもこれでいい気が。使いこなすために、今度キーワードファイルの書き方調べてみる。少なくとも上よりましだと、ええもう。慣れたエディタは使い易いってことで。

正直スクリプト言語ごときで、IDEなんてバカかという話で。調べに走ってるのも愚かという話で。
以前聞いた話ではEclipse+多言語が世界を制覇するということだった気がするんだが、Rubyでこの調子だとまだまだか。

2004/11/11(木)Cookieあれこれ

CGIに管理者モードを搭載する際にクッキーをどうするかという話題。大分混乱してきたので1つ整理。

まずクッキーの仕様から。

HTTPヘッダに以下を書くことによってブラウザにクッキーを食わせる。

 Set-cookie: 変数名=値 [; [変数名=値;] [expires=有効期限(GMT);] [path=URLパス;] [domain=サイトドメイン;] secure]

設定したクッキーはドメイン名とペアで記録される。ドメイン名とPathに該当するURLにリクエストを出す際に、ブラウザはHTTPリクエスト中に

 Cookie: NAME1=OPAQUE_STRING1; NAME2=OPAQUE_STRING2 ...

を含める。この値は環境変数HTTP_COOKIEにセットされる。従って、expiresの値などはサーバ側から知ることは出来ない(多分)ということだ。

クッキーのセットに関して、デフォルト値と気をつけることをいくつか把握しておく必要がある。
・expires省略時はセッションを閉じるとcookieが消える
・path省略時は設定したページのフォルダ
・domain省略時は設定したページのドメイン
・pathに/を設定すると該当ドメインの全サイトに対してcookieが送られる。認証情報をcookieに入れる際には非常に危険
・secureはhttpsでないと意味がない

さて、cookieを用いて認証情報を管理する場合2通りが考えられる。
1.expires無指定で、パスワード入力から同一セッションでのみ管理者と認定
2.expiresに値を入れて、そのcookieを持つブラウザを管理者と認定する

多くのCGIで実装されている、2を採用したいところ。

んで、どこら辺から穴が開くかを考えると、
A.cookie盗まれる
B.通信路盗まれる
C.サーバデータ盗まれる
D.ブルートフォースアタック

A.は2.特有の問題。
B. C.はどちらでも発生するしcgiで考えることはpermission位。無視。
D.はどちらでも発生するが、フォームでのパスワード入力にブルートフォースをかけるのは難しい。認証失敗ページに飛ばすようにすれば、まず問題ないだろう。となるとこれも2.だけの問題でcookieを偽装生成してブルートフォースをかけるという手段が残る。これは比較的やりやすい。

各論。

A.cookie盗難はもうどうしようもない。これがイヤなら、別の通信方法を考えるか2.の実装を止める必要がある。ユーザが気をつけること、で終了するしかないだろう。

cookieを偽装する場合のD.ブルートフォースに関して言うと、名前と値をペアで生成する必要があるためcookie名が"password"など一般的なものでない限り、そう脆くもない。cookie名は多少ひねっておこう。

passwordを平文でcookieに保存するのがイヤであるなら、MD5値(ハッシュ関数)などを設定するようにする。短いパスワードの危険性が多少軽減されるほか、pathの設定ミスによる同ドメイン他者へのパスワード漏洩の危険が下がる。

最初セッションごとにidを生成し、セッションidをcookieとサーバ上に記憶しておいて照合、ということを考えたが、複数管理者の実装が難しい(サーバのファイルにゴミが残りやすい or 管理者1人のみ)となる。passwordハッシュ値が多分妥当な線だろう。

……さて、怪しい知識でここまで書いてしまったが危なかったら指摘して欲しい。
それにしても私が使っているCGI(KShiki,Nicky)は皆、パスワードを平文のままクッキーにつっこんでいる。……こんなんでいいんだろうか?

P.S.友人からRemotehost情報加えてハッシュにかけてはどうかという提案がありました。この場合、cookieを抜かれても、抜いたユーザのリモートホストまで偽装をしなければいけないので、クラックのハードルはぐんと上がりますのでこちらの方が妥当です。ただ、定期的にproxyを切り替えるユーザやプロバイダ2契約でセッションを切り替えるユーザには使えなくなりますか。最近だと、後者が結構居るという話ですが、実態は不明(Flet'sには2セッションはれるのに、プロバイダが1セッション契約な為)

<参考URL>
http://www.yanagisawa.ws/WBL/ASP/session.asp
http://akademeia.info/main/security_lecture.htm
http://www.futomi.com/lecture/cookie/specification.html

2004/11/07(日)Ruby offline mode

Windowsのコンソール環境ではoffline modeから先に進めない問題。Ctrl-Dだと表示されているが、反応してくれない。

結論から言ってしまえば、Unix環境等だとCtrl+Dなのだが、Win32環境だとCtrl+Z Enterとする必要がある。

以下、再現する状況。

CGIを作る時にtest.cgi?a=bという風に引数を指定出来る物を作りたいとする。

そうすると、require 'cgi'で、params = CGI.paramsとするのが一般的だが、これを記述するとconsole実行ではofflineモードとなり先に進めなくなる場合がある。

2004/11/06(土)Eclipse3.0.1 日本語化

なぜかはまりやすいので一応メモ。

Eclipse展開、Language Pack展開の順で普通に問題ないのだがLanguage Packが少々特殊なZIPファイルのようでアーカイバによっては(NG:春M OK:詩子さん)解凍に失敗し、出力ファイルが0byteになる。

さらに、正常に展開できた場合でも事前にEclipseを起動してしまっていると中途半端な日本語化になる(ex.ソース -> Source)。これは、configurationフォルダの削除で直すことが可能。

2004/10/26(火)csc日本語環境整備

2004/10/26 16:00 PC(Linux)
csc環境での日本語環境整備、不備の手直し。

まず、やっぱりというかメインをLANG=Cにして、アプリごとに切り替えるなんてのはだめだった。netscapeはLANG=jaでないと意地でも日本語入力窓が開きやがりません。勿論表示もおかしい。

[fail]
.cshrcの
LANG C

LANG ja
に修正して…… 失敗。
しまった、.tcshrcがあればそっちを見るのだった。

[success]
.tcshrcの
LANG C

LANG ja
kinput2 &
に修正。

この間、.Xresouces辺りまで含めてあちこち書き換えてしまったほか、~/lib,~/manを消したらemacsがsegmentation faultで立ち上がらなくなったりとか。

emacs問題は、結局LANGが原因の頻出でjaにすると大丈夫でした。なんかユーザ辞書消しちゃって作れなくて怒られてるという話なのかな…… しかしLANG環境が変わるとsfするなんて、やっぱりunixに一般ユーザが乗り換えるの無理なんじゃなーいの!?

2004/10/26(火)tgif format(.obj) -&gt; eps

2004/10/26 16:00 PC(Linux)
拡張子が.objであるtgifフォーマットから、ghostview等で見られる.epsへの変換方法。

tgifがある環境で、コマンドラインから

$ tgif -print -eps *.obj

で一括変換可能。

しかし、tgifはwindows版無いのな。そろそろcygwin包囲網が狭まっている予感。