2004/11/23(火)なにかがおかしい(作業マシンのIE)
2004/11/23 5:00
spy bot1.3でpossible hijacker検出。修復したら直りやんの。
orz
- Old-------------------------------------------------------------------
また、知り合い3人に同ページを読んでもらったところ、IEを使っている3人ともが3秒程度で表示されるという状況。
正直原因・打開策全く思いつきません。まだブラウザ環境変える気にはならないし、このマシンから速くないと意味がないんだが……
.NET frameworkが悪さしてる可能性を考えて、アンインストールしたが変わらず。
IEの再インストールも試みたが変わらず。
- Old----
結論から言うと、描画するボタンの総数とhiddenフィールドが描画時間の足を引っ張っているようだ。
<<調査内容(超手計測)>>
・
2004/11/23(火)xml -> csv
2004/11/23 5:00
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の速度をどう見るか
2004/11/21 26:00
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仕様メモ
2004/11/16 26:00
↑友人からの指摘で仕様書読み直してみましたが、ノードテストのところに(|)は書けなさそう?、文法能力低いのでちゃんとは分からない。
rexmlにおいては、
"/data/(software|category)"
は望み通りの結果を与えない。"/data/*"と同じ集合がかえってくるようだ。他にも幾通りか試したが、rexmlでは(|)が使えない気配。
この場合、
"/data/*[name()='software' or name()='category']"
とすることでsoftwareとcategoryの集合がかえってくる。当たり前だが、name()をnameとすると全く違う意味になるので気をつけろ! うーん、なんか間違えてるんだろうか。
2004/11/15(月)DOM? DHTML? in Mozilla? IE?
2004/11/14 26:00
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開発環境
2004/11/13 26:00
・RDE
日本人がRubyの開発をするということに限れば、最有力候補。他の開発環境で出来る機能はほぼ完備。しかしUTF-8の解析が怪しく、しかも対処法無いっぽい。今回のには不適。イマイチ補完機能が働いてない?
更新が半年以上止まっていて将来性も不安。アドレス違反がしょっちゅう起こるので怖い。
・Eclipse + RDT
ちゃんと動いてない? 組み込みクラスの補完機能が無いのか働いていないのか。自分の環境が悪い可能性大だが、ドキュメントがないので今ひとつ。これも半年以上更新が止まっている。機能的には多分RDEよりしょぼい。
・xyzzy + Ruby-mode
lispわかりません。xyzzyもわかりません。以上。
・sakura + Ruby
結局ここか! えーと、sakuraはプログラマユーザが少ないためにスクリプト言語のキーワードファイルがイマイチ整備されていない。一応Rubyの強調表示はあるが制御構造と、関数定義部くらい。でもこれでいい気が。使いこなすために、今度キーワードファイルの書き方調べてみる。少なくとも上よりましだと、ええもう。慣れたエディタは使い易いってことで。
正直スクリプト言語ごときで、IDEなんてバカかという話で。調べに走ってるのも愚かという話で。
以前聞いた話ではEclipse+多言語が世界を制覇するということだった気がするんだが、Rubyでこの調子だとまだまだか。
2004/11/14(日)Ruby インストールメモ
2004/11/13 24:00
http://arton.hp.infoseek.co.jp/indexj.html
2004/11/11(木)Cookieあれこれ
2004/11/10 27:00
まずクッキーの仕様から。
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
2004/11/06 27:00
結論から言ってしまえば、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 日本語化
2004/11/05 24:00
Eclipse展開、Language Pack展開の順で普通に問題ないのだがLanguage Packが少々特殊なZIPファイルのようでアーカイバによっては(NG:春M OK:詩子さん)解凍に失敗し、出力ファイルが0byteになる。
さらに、正常に展開できた場合でも事前にEclipseを起動してしまっていると中途半端な日本語化になる(ex.ソース -> Source)。これは、configurationフォルダの削除で直すことが可能。