2004/11/23(火)なにかがおかしい(作業マシンのIE)

******  スパイウェアが原因でした  ******

spy bot1.3でpossible hijacker検出。修復したら直りやんの。

orz
        • Old-------------------------------------------------------------------
以下の記事は、なんと作業用マシンのIEでしか発生していない。ノートパソコンでの表示(同じXP SP1、同update状態、低スペック、ビデオカードRade系統、同DHCPにぶら下げている)は"admin mode"でも3秒弱と問題ないスピード。

また、知り合い3人に同ページを読んでもらったところ、IEを使っている3人ともが3秒程度で表示されるという状況。

正直原因・打開策全く思いつきません。まだブラウザ環境変える気にはならないし、このマシンから速くないと意味がないんだが……

.NET frameworkが悪さしてる可能性を考えて、アンインストールしたが変わらず。
IEの再インストールも試みたが変わらず。
        • Old----
さて、ユーザモードは2~3秒で開くようになったので満足としても、管理者モードだと未だ7秒超かかる。アウトプットは0.2秒で出来ているため、ブラウザの描画での問題。なんかいい資料が見つからなかったので自分でざっと実験。きっとあると思うんだが。

結論から言うと、描画するボタンの総数とhiddenフィールドが描画時間の足を引っ張っているようだ。
<<調査内容(超手計測)>>
の数 -> 影響なし
の数 -> ほぼ影響なし
の数 -> 影響あり
の数 -> 影響あり
・cssの使用、および記述内容 -> ほぼ影響なし

ボタン100個、hiddenフィールド200個につき1秒超くらいかかっている気配。このCGIが吐くページでないと再現性がない? でもValidatorは一応通ってるからなあ…… トップの検索から、ノードデータの編集に飛べないのは不便、なんとかしたい。

ラジオボタンが1つ逃げの打開策。hiddenフィールド、ボタンを減らす方向で1ボタンであとで分岐させるのが折衷案。

うーんもうちょい考えますか。

P.S.
Firefoxだとhiddenがいくらあろうが2秒で表示してくれます。IE固有? ションボリ。

2004/11/23(火)xml -> csv

REXMLを断念した。

REXMLを使用した場合、100件程度のデータの表示において私の腕では、
$ time ruby value.cgi > test.out
による計測で4.2sec~4.6secと4秒を切れない。「表示まで5秒」ルールを達成するのはどうやら無理。

奇っ怪な記法で多少の速度アップは出来ないことはないが、スクリプト言語の最大の利点は読みやすさにあるべきだと考える。そもなぜXMLを使おうとしたかというと、データの可読性と保守性が欲しかったから。まあ実際は、腕の問題か。

そんなわけで、csvで実装し直した。それなりに冗長に書いたのにもかかわらず同計測で、0.2sec。同じデータを使用していないので、公平なテストではないが100件程度で揃えてはある。ruby + xmlを使うのは時期尚早だったようだ……

さて、rubyの場合なにせHashクラスがあるためcsvの管理は相当楽。csvは1行目にkey、2行目以降を実際のデータとして、1行目と各行をzipで閉じてHashにつっこむ。csv自体の可読性・保守性もアップと実にありがたい話。疑似ツリーも簡単に作れるし、REXMLのAPIとにらめっこしたのはなんだったんだろうか。

ちなみに、計測に使用したCPUはC3 800A MHzナリ。単体で買えるCPUで現役最低消費電力。

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フォルダの削除で直すことが可能。
OK キャンセル 確認 その他