p expの不思議

DBを使わない方針なのでユーザ情報はユーザ毎のディレクトリに保存しています。
新しいユーザから要求が来たら、cgiディレクトリを作成しますが、ディレクトリの存在確認も面倒なので同じユーザでもディレクトリを作成するようにしています。
普通にやるとExceptionが出るので、begin - rescueでくくってるのですが、デバッグ用にexceptionをprintしていました。
すると、cgiがエラーに....???
↓こんなコード
begin
  Dir::mkdir("c:\\test")
rescue => exp
  p exp
end

WEBrickを起動しているコンソール出ているメッセージを見ると、「ERROR bad header」と。
googleで検索してみてもそれらしい事例は引っかからない....

>[2009-04-30 11:12:01] ERROR bad header '"#\n"'.
>localhost - - [30/Apr/2009:11:12:00 東京 (標準時)] "POST /request.rb HTTP/1.1" 500 385

HTTPのステータス500は内部エラーなんだけどな。
デバッグログを入れたりして調べた所、cgiの処理が全部終わってから上記のメッセージがコンソールに出る事が判明...
よくわからないので、rescueの「p exp」をコメントアウトすると、なんと動いた!

exceptionをthrowしたことになるのかな?
いや、そんなことはないと思うんだけど....
とりあえず「p exp」の部分をコメントアウトしました。

とりあえず、これでGWに入りまーす。

さっそく・・・

1つ画面を追加したら、昨日作成したクラスが破綻しました...
1つ画面を追加しただけで破綻するクラスって...。改めセンスのなさを実感しております...

とりあえず、2画面で動くクラスに直そうとおもったんだけど、次の画面を追加したらまた動かなくなるような気がするので、ちょっと考えてから作り直します。

今日のまとめ

クラス定義しました。
個々に作成するファイルをクラスにできそうだったので。
ただ、相変わらずの行き当たりばったり何で作っていくうちに変わりそうです。
というか、すでに怪しいそうな臭いがしている場所が...

まぁ、utilから昇格したということでOKにしておいてください。
#しゅみですしね。

今日のまとめ

昨日、うまくいかなかったファイルのアップロードですが、はじめに参考にしたページの方法ではうまくいきませんでした。
#サンプルの通りでもダメでしたね...私のやり方がまずいのでしょう。

で、もう少し調べた結果、
http://code.nanigac.com/source/wiki/view/503
というページを発見。

念のため、このページのサンプルをそのまま動かして確認したところ、今度はうまくいきました。
#テストなどでHTTPサーバをローカルに起動している人は、open()に書いてある、
#「OUTPUT_DIR + form['upload_file'].original_filename」を
#「form['upload_file'].original_filename + ".txt"」などに変更する必要があります。

サンプルがうまくいったので、そばちょに反映したところまた動きませんでした...
サンプルに手を加えたり、そばちょのソースを削ってみたりしてして確認してみたけどやっぱりそばちょでは動きませんでした...

で、ふと気が付いたのがhtml。ファイル名を入れるinputタブは TYPE=TEXT で作ってたんですが、サンプルは TYPE=FILE になっております。
サンプルに合わせて TYPE=FILE にしてみたらうまくいきました!!!

そんな・・・という感じですが、サンプルには忠実にということですね。

今日のまとめ

・class/module name must be CONSTANTというエラーが出ました。
いつものようにGoogleで検索してみました。

http://masaru.org/diary/20071009.html

によると、クラスは大文字から始まらないとだめだって。そうだったかな?今までクラスを作ったこともあるんだけどな。


・メールアドレスをファイル名にするので、ファイル名にできない文字を変換する。
使えない記号を文字列にしてeach_byteで1文字づつ取り出そうと思ったけど、each_byteはStringを返さないんだね...
しかたないのでsplit()で1文字づつ取り出すことにしました。
このときお世話になったのがこちら。
http://www.rubylife.jp/ini/string_class/index12.html
いつもながら助かります。
#にしても正規表現は難しい...


CGIのformから取得したデータはStringじゃなくて、StringIO?
なんでだろう?
前にお試しで作ったものはStringだったと思うんだけど。
で、ふと、htmlを見てみると、formタグに「enctype="multipart/form-data"」と。
これだ...
ファイルをアップロードするようなので、この定義は残しておくとして、
メールアドレスはどうやって取得したものか?

http://itpro.nikkeibp.co.jp/article/COLUMN/20050926/221633/?SS=imgview&FD=7256014
にStringIOをStringする方法が載っておりました。


・ファイルのアップロードのところでエラーになりますね。
なんでだろう...
サーバ側にファイルは出来てるんだけどなぁ。
今日はちょっと遅くなった(という時間でもなけど)ここまでで。

受付

受付処理を作りました。ほとんどGoogleで見つけたページそのままなんですぐできました。
受付けたデータの調査はcronか何かで定期的にチェックすることにしよう。

受付けたことがユーザページで確認できるようにしようかな。
でも、DBを使わないから・・・。
ユーザ毎にディレクトリを作って、そこにファイルを置くことにしました。
で、一覧画面のcgiでファイルの一覧を取得すればいいかな。
ファイル名を工夫すれば処理状態や処理時間なんかも一覧画面に表示できるね。
#そこまでしてDBを使わないようにするってのも本末転倒ってやつでしょうか...

で、受付cgiのファイル受信処理に加えて、状態を管理するファイルも作成する処理を追加しよう。

悩み事その1

クラス定義。(書き方という意味じゃなくて...書き方ぐらい知ってます。はい。)
CGIに対応する.rbは自然と作るでしょう。

今読んでる『伽藍とバザール』にもあったけど、データ構造が重要。
なので、それなりにクラスを作ってみようと思ったんだけど、今回のappはあまりクラスが思いつかない...
というか私のオブジェクト度が低いだけなんだけど...

色々思いつくけど、整理できない...。十分検討してからがほんとなんでしょうね。
ただ、こういうプライベートなappは勢いが大切で、作りたい時にある程度作らないと。という言い訳を。

とりあえず、utilでお茶を濁します...