随感録 2001年3月

2001-03-04 (Sun)

昨日は日本酒をえらく飲んだり。

今日は昼から起き出し,買い物。スノボーのグラブ,ヘッドホン。いったん帰って,散髪。

2001-03-05 (Mon)

日記の検索機能がエラーになっていたのを修正。

2001-03-08 (Thu)

何か吹雪いててびっくり。帰りもえらく寒かった。でも降ってたのは一瞬だけ?

2001-03-09 (Fri)

今日も雪。

# クッキー,セキュリティレベル

Tag(s): Ruby CGI

Rubyでクッキーを使ってみる。

def pass_ok()
  print <<EOF
Content-Type: text/html; charset=EUC-JP
Set-Cookie: u=ok;expires=#{CGI.rfc1123_date(Time.now + 60 * 30)}

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<p>ユーザーhoriさんですね。
</html>
EOF
end

かなりダメすぎ。ユーザーの区別をしようと思うとvalueをユーザーごとに違う文字列にしないといけない。ユーザーIDを直接書いてはいけないので,MD5か何かを通せばいいかな。

クッキーを受け取るところ;

if !cgi.cookies['u'].empty?
  pass_ok()

クッキーで示されるユーザーが存在するか,有効期限が切れていないかサーバーでも調べないと。CGIに限らないが,クライアントからのデータを信用してはならない。

そうそう,Rubyはセキュリティ水準をスクリプト中で変更できるので,$SAFE=1しておく方が吉。

2001-03-10 (Sat)

昼に起きる。元町で電車を降りて,三宮までぶらぶら。agnès b.,AfternoonTeaとか。名刺入れ,Gパンなどをゲット。雑貨とか見るのは楽しい。空がぐずってたのがちょっち面白くない。

三宮で石橋楽器に寄ったり。なかなか広い。

# ファイルをロックせずに共有ファイルを書き換える

Tag(s): Ruby CGI

RubyでCGIスクリプトを書く場合,ファイルの共有に気をつける必要がある。すなわち,あるファイルを読んでいるときに,別のプロセスが書き込んだり,ファイルを切り詰めたりすると大変。

大抵はFile.flock()を使って同時にアクセスしないようロックするが,File.rename()もなかなか良好。例えばhoge.datを書き換えるとして,hoge.datをロックするのではなく,hoge.dat.tmpに書き込み,hoge.datにrenameする。

あるプロセスが今開いているファイルへrenameした場合の挙動を調べてみた。

  3: FNAME = "test"
  4: 
  5: fp = File.open(FNAME, "w")
  6: fp.print "12345\n"
  7: fp.close
  8: 
  9: fork {
 10:   # child
 11:   fp = File.open(FNAME, "r")
 12:   sleep(3)
 13:   print fp.gets
 14:   fp.reopen(FNAME, "r")
 15:   print fp.gets
 16: }
 17: 
 18: # parent
 19: sleep(1)
 20: fp = File.open(FNAME + ".tmp", "w")
 21: fp.print "abcdefg\n"
 22: fp.close
 23: File.rename(FNAME + ".tmp", FNAME)

行9から行16のプロセスでファイルを開いているときに,行23でそのファイルに上書きする。実行結果は次のとおり。

~/ruby$ ruby rename.rb
12345
abcdefg

行13では元のファイルの内容12345が表示され,行15で新しい内容abcdefgが表示される。

ファイルのロックを行わなくても,安全にファイルを書き換えることができ,同時にパフォーマンスも向上する。なお,SUSv2でもファイルの実体が削除されるのはファイルが閉じられたときとあるので,UNIXシステム環境では移植性があるだろう。

Windows環境ではrename先が存在するとエラーになるので,この技は使えない。

2001-03-11 (Sun)

朝5時半に出発してスノボー。雪の状態は六甲よりよい,って当たり前か。80年分堪能。もうスノボーは十分です。私ゃスキーの方がいい。

2001-03-13 (Tue)

昼から近畿財務局。会社に戻って会議。疲れた。というかムッとしたというか。

MDプレイヤーとミキサーをつないで,スピーカーから鳴るようにしてみた。なかなか良好。これならCDを借りてきてMDに落としてもよさげ。

2001-03-14 (Wed)

少し早起き。

# 共有ファイルの書き換え (2)

Tag(s): CGI

プロセス間で共有するファイルを書き換える場合に,一時ファイルに新しい内容を出力して,それをrenameする話を以前書いた。2001.03.10/ruby

このとき作成する一時ファイルのファイル名を目的のファイル名から作成すると,その一時ファイルを排他ロックしないといけない。これではあまり意味がない。一時ファイルのファイル名はランダムに選ばないといけない。

2001-03-15 (Thu)

昼からコンサルタント会社の人と打ち合わせ。途中,脱力してしまう。顔に出るとは私もまだまだ甘い。

あくまでも一般論として,3秒前の誰かの発言を繰り返すだけで自分では何も考えない人間など使えねー。

2001-03-17 (Sat)

昼からHYATTでケーキバイキング。なかなか美味し。でももう数はあまり食べれない。

ATCでリサイクル品の催し物があったので,それを見たり。そこでチャリティ・オークションをやってたけど,開始価格高すぎ。場が全然盛り上がってなくて,ある意味笑かす。そのあとアウトレット・モールを回ったり。結構,値頃。

梅田に戻って飲みに行く。

私的に身辺整理を少々。だらだら続けるのはよくない。言動の一貫性を向上させよう。2001.03.24

2001-03-18 (Sun)

# クッキーの生成 (2)

Tag(s): Ruby CGI Webデザイン

2001.03.09/cgi Rubyでクッキー の続き。

クッキーを生成するスクリプト。きっと,もっと簡単にできるかも。

  6: def create_new_cookie(t)
  7:   # t = 秒数
  8:   db = SDBM.open("db.sdbm")
  9:   lf = File.open("db.lock", "w")
 10:   now = Time.now.to_i
 11: 
 12:   # 期限を越えたレコードを削除する
 13:   db.each {|k, v|
 14:     # ここはロックする必要なし
 15:     db.delete(k) if v.to_i < now
 16:   }
 17: 
 18:   while true 
 19:     k = sprintf("%016x", rand(0x10000000000000000))
 20:     
 21:     lf.flock(File::LOCK_EX)
 22:     # db[k]が空だと判断してから書き込むまでがatomicでなければならない
 23:     if !db[k]
 24:       db[k] = now + t
 25:       lf.flock(File::LOCK_UN)
 26:       break
 27:     end
 28:     lf.flock(File::LOCK_UN)
 29:   end
 30:   lf.close
 31:   db.close
 32:   return k
 33: end

ポイントは,ランダムな文字列を生成して,それを保存しておくこと。Webブラウザからクッキーが提示されたときに,保存してあるのと照合して期限が切れていないかを確認する。

上記のスクリプトでは,まず期限が切れたクッキーを削除した(行13〜16)後,新しいクッキー文字列を生成している(行18〜29)。

まず期限が切れたクッキーを削除するところでは,単純に現在時刻と比較して,保存されている時刻が古ければ削除している。

新しいクッキーの生成は,ある程度大きな乱数を生成して,それをキーにして有効期限の時刻を登録している。

サーバーからWebブラウザにクッキーを渡すときに,ここで生成した文字列を使えばよい。

2001-03-19 (Mon)

携帯でメールが届くようになった;

携帯の電話番号@sky.tkk.ne.jp

2001.03.24 スカイメッセージを解約しEZwebにしてみたり 2001.03.29/03 やっぱりスカイメッセージに戻した

2001-03-20 (Tue)

昨日の夜にバスに乗り込み,スノボーに。いや今回はスノボーでなく,スノーブレードに初挑戦。今日の6時半ぐらいに現地(ダイナランド)に到着。7時すぎから滑降。

DynaLand2001

スノーブレード,めちゃめちゃ楽しいやん。板を楽に回せるし,両手が自由になるのもいい。

2時まで,中級コースとか小さなジャンプ台とかいろいろやってみる。昼ご飯以外ほとんど休みなく滑ったので,もうくたくた。

その後,温泉というか大きめの銭湯?で汗を流す。

帰りのバスで『すべてがFになる』を完読。すごい! このシリーズ,これを入れて本編を4冊読んでいるが,これが一番驚愕。

Mori's Floating Factory

身体も頭も今日は心地よい興奮でなかなか気持ちいい。

2001-03-21 (Wed)

システム関連の打ち合わせ。自前で組まなくてもパッケージを買ってきた方が早いし安いような気がするのは気のせい?

2001-03-25 (Sun)

親戚の結婚式。チャペルはよいね。でも牧師の説教が聞き取りづらくて価値半減。

披露宴を抜け出して飲み会。

# WebBoard

Tag(s): リリースノート Ruby

Ruby 1.6.3リリース記念でWeb掲示板を更新。

2001-03-29 (Thu)

メールが届く。1998.04.02に書いた「コネコネ将棋」なる変則将棋について。えーっと,全く覚えていません。どなたかご存じの方がいれば逆に教えてください。

#

ケーブルテレビインターネットのセキュリティについて。とりあえずファイル共有できないようにし,Windowsなどのアップデートを行う以上のことは思いつかない。

うちの家はマンションで今のところフレッツISDNだが,ISDNルーターがNAT機能を持っていて外からのパケットを捨ててくれるので,参考にならない。

#

今日の話ではないが,EZwebを解約しスカイメッセージに戻した。メールアドレスは2001.03.19の通り。

2001.03.24

2001-03-31 (Sat)

仕事帰りにTHE CELLを観たり。スリルと緊張が強い。えらく疲れる。うーん,2度観たいとはあまり思わない。

宇多田ヒカル/Distanceをゲット。

#

Web検索フォームを強化。別ウィンドウに検索フォームを表示し,いろいろな検索が楽にできるようにした。