08/12/23 19:06:53
自分用ライブラリです。なので、究極的にはどうでもいいんですけれど。
「ローカルファイルを読み込んで、書いてあるデータを変数とかに取り込むクラス」があります。
変数は外部からそれなりの頻度で参照されますが負荷とかは無視して結構です。
class HogeFile
def initialize(path)
@path = path ...
end
attr_reader :mtime, data2, ...
def parse
file = File.read(@path)
@mtime = File.stat(@path).mtime
@data1 = file.scan(/.../)
end
end
という、HogeFile.new.parse が必要なタイプと
class HogeFile
def initialize(path)
@path = path
@data = File.read(@path)
end
def mtime; @mtime ||= File.stat(@path).mtime; end
def data1; @data1 ||= @file.scan(/.../); end
end
という、なんというか遅延評価?っぽいのって、どっちをメインに使っていくのがいいもんでしょか。
こういうデータクラスってけっこう作るんですよね。
775:デフォルトの名無しさん
08/12/23 19:13:25
ほぼ全ての変数を必要とする(アクセスしない可能性のある変数というのがまず無い)のなら前者
変数をまとめてPStoreとかに保存する可能性があるとかいう場合も前者
っていうか基本は前者
data4 くらいで超ごっつい正規表現処理があって処理の流れが一瞬止まるとかいうことがあるなら後者がいいかも
ネットからファイルを適宜取得するタイプのライブラリでは後者を時々見るな
考え方のベースとなるものは君の言う通り遅延評価だ
それが有効かどうかだけで決めちゃっていいと思う
あるいはカッコイイかどうかだけでもいい
(この場合ほぼ全ての自作スクリプトで後者になって、2年くらいして見返して「あーこの頃は遅延評価時代だー」とか懐かしむことになる)
776:デフォルトの名無しさん
08/12/23 19:37:02
てかデータクラスにparseさせんな
それは別のクラスでやって、結果だけをアクセサ経由でデータクラスに登録しろ
777:デフォルトの名無しさん
08/12/23 20:00:17
>>776
えー
めんどい
778:デフォルトの名無しさん
08/12/23 21:05:40
>>769
その環境かかないとよくわからんぞ
共有レンタルサーバーなら負荷掛けるとかってに落とすところもある。
見れるならerror_logは最低みとかないとな
いや多分、個別の環境かかれても俺はなんともいえんと思うけどw
779:デフォルトの名無しさん
08/12/23 21:11:45
>>776
主張の理由kwsk
780:デフォルトの名無しさん
08/12/23 21:18:50
いやそれ自体はそのまんまだろ
めんどくさいからやんねーというのも反論そのまんまだ
781:デフォルトの名無しさん
08/12/23 21:27:09
そういう宗教があるんだろう
782:デフォルトの名無しさん
08/12/23 21:30:16
データとパーサを分けるのは設計の常識みたいなものだけど、個人で作るアプリなら分けなくてもいい。
他人に迷惑をかけないという意味でね。
783:デフォルトの名無しさん
08/12/23 23:02:54
>>771 むしろ ruby がちゃんと走ること自体結構感心した。130MHz だもの。
784:デフォルトの名無しさん
08/12/23 23:08:05
組み込みでも 130MHz とかいくのか・・・。
8~9年前は普通にノートパソコンで使ってたぜ・・・。
785:デフォルトの名無しさん
08/12/23 23:25:22
Mechanize で質問です。
agent = WWW::Mechanize.new
agent.get(url)
form0 = agent.page.forms[0]
form1 = agent.page.forms.name('form1')
form0.name == form1.name #=>true
form0 == form1 #=>false
となります。
form0とform1とは同じものを参照していると思ってたのですが,
どんな違いがあるのですか?
form0.action = 'hogehoge'はうまくいくのに
form1.action = 'hogehoge'はエラーになるので疑問が生じました。
786:デフォルトの名無しさん
08/12/23 23:33:45
>>784
うちの自宅サーバ、その頃のノートPCだったりする。(Pentium133MHz、メモリ40MB)
RubyのCGIが、起動するだけで4秒かかるよ!! 動き始めるとそんなに遅くないんだけどな……。
787:デフォルトの名無しさん
08/12/23 23:40:24
>>785
form1は WWW::Mechanize::List だから、= を使った代入は行えない
form1.action は form1[0].action の返り値、すなわち action 属性の文字列を返す
URLリンク(d.hatena.ne.jp)
form1.action = 'hogehoge' は文字列に代入するという奇妙なことになっているだけ
788:デフォルトの名無しさん
08/12/23 23:48:58
このへんの動作と返り値のオブジェクトの種類を全部把握しないと使えなくて紛らわしいので、
WWW::Mechanize::List は最新版 0.9.0 では削除されてる
agent.page.forms.name('form1') と書いたら NoMethodError で動作しない
Mechanize のバージョンが 0.8.5 かそれ以降なら form_with が使えるよ
それより古いなら、name に限っては agent.page.form('form1') がフォームオブジェクトを返すほぼ同じ動作をする
form0 == form1 を true にしたいなら、List からフォームオブジェクトを取り出して比較してくれ
form1[0] が WWW::Mechanize::Form クラスのオブジェクトを返して form0 と同じもののはず
789:デフォルトの名無しさん
08/12/24 00:04:55
う、答えになってね
> どんな違いがあるのですか?
「agent.page.forms[0] は WWW::Mechanize::Form クラスのオブジェクトを返しているが、
agent.page.forms.name('form1') は WWW::Mechanize::List クラスのオブジェクトを返してる」
が回答でございます
だから、
form1 = agent.page.forms.name('form1')[0]
と、List 内の要素を明示的に取り出さないと、WWW::Mechanize::Form オブジェクトそのものにはならないよ
「クラスのメソッドは Object#send で動作するし、返り値も普通に返ってくるけど、目的のクラスのオブジェクトではない」という変な状態
抽出作業が完了したら [0] をつけて特定する癖をつけておかないと、今みたいに変なとこで詰まったりするぞ
790:デフォルトの名無しさん
08/12/24 00:19:13
120MHzあればRubyは動くよね
rubygems は鬼のように重いけど
791:デフォルトの名無しさん
08/12/24 00:22:34
>>787
…このサイト作った奴バカだろ
せいぜい中堅どころのライブラリのメソッド全解説とか何が楽しいんだよ
792:デフォルトの名無しさん
08/12/24 00:29:41
>>791
現在のRubyはそのような
「こんなことまでわざわざ書く理由って何よ?」
という人の努力によってなんとかうまく支えられております
マニュアル書く人しかり、丁寧な導入記事書く人しかり
793:デフォルトの名無しさん
08/12/24 00:49:24
>>791
真意は知らないけど個人的感想としては、mechanizeのライブラリ構造も
単純ではないしRubyの勉強方法として良い手だと思った。
「理解した(自称)」以上に理解が進んでないと説明することなんて
できないんだよなぁ・・・。説明してる内に薄っぺらさが露呈する。
告白デバッグが気付かせてくれるのはまさにそれ。
794:デフォルトの名無しさん
08/12/24 00:58:31
以上ちらうら
795:デフォルトの名無しさん
08/12/24 03:08:36
hpricotでdiv.entryで取得した記事数分ハッシュを作成するにはどうすればよいでしょうか?
Keyはentry_1->entry_nまででvalueは単語数とか他で計算した値を入れようと思うのですが.
796:デフォルトの名無しさん
08/12/24 03:27:22
mechanizeのデフォルトパーサがHpricotからNokogiriになったな。
いつのまに・・・
797:デフォルトの名無しさん
08/12/24 05:57:55
Railsを使ってプロジェクトを自動生成して
ruby script\generate controller main index
を実行したのみのプロジェクトでRubyのテストをしています.
webrickを起動して
URLリンク(localhost:3000)
のhtmlページは,問題なく表示するのですが
URLリンク(localhost:3000)
でindexページを見ようとすると
1度目は正常に表示されますが,
更新ボタン(もしくは,アドレスバーの移動ボタン)を押すとWebrickが次のようなエラーを出して終了していしまいます.
127.0.0.1 - - [24/Dec/2008:05:44:28 東京 (標準時)] "GET /main HTTP/1.1" 200 283
- -> /main
127.0.0.1 - - [24/Dec/2008:05:44:33 東京 (標準時)] "GET /main HTTP/1.1" 200 283
- -> /main
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/mysql_adapter.rb:196: [BUG] Segmentation fault
ruby 1.8.6 (2007-09-24) [i386-mswin32]
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
ひとつ目の-->/mainが移動時,ふたつ目が更新時です
どのように対応すればいいでしょうか.
798:デフォルトの名無しさん
08/12/24 07:21:44
>>795
search メソッドの返り値は Hpricot::Elements で、配列のような動作をするっていうか配列でできることは全部できる
これに詰まってる要素に当たるものは Hpricot::Elem だ
Hpricot::Elem にはタグに囲まれてる文字列を適当に返す inner_text メソッドや
HTMLで整形して返す inner_html メソッドがあるし、
Hpricot::Elem オブジェクトから search でさらに探すこともできる
それ以上のもんではないので、普通にどうにかして作れ
799:デフォルトの名無しさん
08/12/24 08:43:05
>>797
[BUG]と出た場合、Rubyのスクリプトレベルの誤りではないので、
開発サイドに再現コードを教えるくらいしかできることはない。
800:デフォルトの名無しさん
08/12/24 08:49:16
BUGと出ても、自分がわけのわからんオブジェクトを引数でメソッドに渡してるとか
回避できるものもあるけど
801:デフォルトの名無しさん
08/12/24 09:45:55
回避できてもバグはバグなんじゃね?
802:デフォルトの名無しさん
08/12/24 10:59:53
すいません、ググっても解決できなくてハマっているので教えてください。
ruby1.8にて、ptyとexpectモジュールで、自動sshログインをしようとしているのですが。
cygwin上では、問題なく動かせるものの。
solaris(free10)では、spawn('ssh ***.***.**')の所で
> open: pty slave: No such file or directory
とでてしまいます。
このspawnの内部をsshのフルパス指定にしたり、lsなど他のコマンドに代えても同じでした。
どうもptyモジュールが上手く動かせてないと考えているのですが。。。
特にptyにはパラメータはなさそうです。
ptyがやろうとしてる仮想tty?という処理がなんなのかが理解できてない....
すみません、どなたか動かすヒントだけでも教えてください。
803:デフォルトの名無しさん
08/12/24 11:18:49
>>802
Solarisスレで聞く
804:797
08/12/24 13:03:37
>>799-801
こちらの環境が悪いんじゃなくて
Ruby(もしくはRails)開発側が悪いってことでしょうか?
手書きでは,まだコードを一行も書いていないので
そんなことないと思いたいのですが...
Rubyのダウングレードとかで対応できないか今夜にでもやってみます...
805:デフォルトの名無しさん
08/12/24 13:22:51
>>804
まずは1.8.7-p72のか、せめて1.8.6の一番新しいp287を試してみるべき。
URLリンク(www.garbagecollect.jp)
one-click installer使ってるんだろうけどこの際我慢。
806:802
08/12/24 14:13:10
1.8.7-p27 のソースからのビルドでしたので。
なにかヒントがないかとざっと眺めると、 ./ext/pty を発見。
ダメ元でpty.c をのぞいて、問題点を探してみると、
どうも"TIOCSCTTY "の定義が無い事がまずいんじゃないかと推測。
この情報を元にググってみると
去年の8月、ruby-lang に "Bug in ruby extension" というスレを発見
> I noticed that Solaris 10 does not support TIOCSCTTY so in function
> establishShell() the child process closes the slave device and reopens it to ...
どうやらSolaris 10 において、ptyの問題が指摘されている模様。
TIOCSCTTY がキーワードみたいだが。 私では何がまずいか理解できない(汗)
このスレで問題対応パッチが登場し、最後にmatzさんが"そのパッチをコミットしてくれー"と書いている。
これが今回の私の問題点と同じであるなら、最新版なら動くはずじゃん。と思い・・・.
あ、でも、1.8.7-p27 が 1.8系の最新版ですよねぇ。
うぐぐ、この問題と関係がないのかなあ。。。。(´・ω・`)ショボーン
>803
レスサンクス。
推測通りsolarisの環境がらみの問題なら、海外で聞いた方がよさそうですね。
英語で聞くのは閾が高いなあ...(´・ω・`)
807:802
08/12/24 14:14:57
>806
s/1.8.7-p27/1.8.7-p72/
808:デフォルトの名無しさん
08/12/24 15:34:50
>>786
Passenger入れろw
っていうほどのメモリもないみたいだがwww
809:デフォルトの名無しさん
08/12/24 16:20:13
以下のようなフォームデータを cgi クラスで受け渡したいと思っています。
<form action="" method="post">
<input type="text" name="server" value="#{server}" />
<input type="text" name="name" value="#{name}" />
<input type="submit" value="更新" />
</form>
それも同じ形式のフォームを何個か繰り返しおいて、しかもその個数も可変にしたいと思っています。
さらにそのデータは pstore に保存したいと思っています。
古い CGI での方法ならば変数名 server などに番号をつけて server1, server2 などという変数名として
ループで 1..max をまわして処理するというのが思いつくのですが、Ruby 的にエレガントな方法はあるのでしょうか?
配列やハッシュなどを使ってスマートに書く方法があったら教えていただけませんでしょうか。
810:デフォルトの名無しさん
08/12/24 17:50:42
hiddenを入れれば区別出来るんじゃね
811:797
08/12/25 00:36:49
>805
どちらをインストールしてみても結果は一緒でした...
これってRuby開発者側に伝えた方がいいのでしょうか
うちの環境のみの再現だと思うのですが...
812:デフォルトの名無しさん
08/12/25 01:18:37
rakeで、src/**/*.txt から dst/**/*.html に変換するような file タスクを書きたいんですけど、どうかけばいいですか。
813:デフォルトの名無しさん
08/12/25 05:11:00
a hrefの値の中にABCっていう文字列があるリンクの中身つまりinner_textを取得するにはどうすればいいでしょうか?
hpricotやNokogiriで指定しようにも複数のページでXPATHのaの順番が違っていて取得できません。
814:813
08/12/25 05:36:00
すいません、事故解決です。
doc/"a[text()*='ABC']"でできますね。
Hpricotとかをtagやセレクタでぐるぐる回すものだと勘違いしてました。
お騒がせしました。
815:デフォルトの名無しさん
08/12/25 06:04:46
>>811
自分のコードかデータにバグを引き起こす原因があるとは思わないの?
816:デフォルトの名無しさん
08/12/25 06:44:34
>>815
スレリンク(tech板)l50
817:デフォルトの名無しさん
08/12/25 06:51:44
>>797
とりあえず該当の行を見て、まずどこて落ちたのかを調べるべき
それでも本体のバグっぽかったら諦めて報告
>>809
本題とは関係ないけど、CGIアプリケーションでPStore使うのはオススメしない
rubyのバージョンが古くなるとデータ読めないことがあるから
自分しか使わないスクリプトなら問題はないけど
今ならYAML::Storeオススメ
818:デフォルトの名無しさん
08/12/25 13:26:33
>>810
hiddenを入れて対処できました。ありがとうございました。
>>817
そうなんですね。YAML::Store に書き換えておきました。ありがとうございました。
819:デフォルトの名無しさん
08/12/25 13:59:37
>>815
>>797見てそう思う方がおかしくないか?w
でもmysql環境を見直してみる価値はありそう。
820:デフォルトの名無しさん
08/12/25 15:36:57
某サイトのurlをopenした所、
uninitialized constant StanderdError (NameError)
こんなメッセージが出てプログラムが途中で止まることがあるですけど、これって何が原因なんでしょうか。
821:デフォルトの名無しさん
08/12/25 15:38:47
>>820
>StanderdError
StandardErrorと書いたつもりのどっかでスペルミスしてる。
822:デフォルトの名無しさん
08/12/25 15:45:45
がっちょわるー
class MyHogeError < StanderdError
end
とか書いてあるんだな
がっちょわるー
>>820
使ってる外部ライブラリの中から「StanderdError」という文字列を探して「StandardError」に直接書き換えとく
823:デフォルトの名無しさん
08/12/25 15:51:11
> rubyのバージョンが古くなるとデータ読めないことがあるから
これをあまり心配してない俺
その時になってから過去のバージョンの pstore で読んで、新しいバージョンの pstore で書き出せばよくね?
PStore を YAML で置き換えて常用するなんてブルジョワジョワジョワに過ぎるだろ
824:デフォルトの名無しさん
08/12/25 15:57:22
どんなデータをどんだけ保存したいかによるね
ファイルが数KB程度で収まるなら読みやすいYAMLのほうがよかろう
なんかよくわからん大量のデータの数百KBを読み書きしまーすというのならさすがにちょっと
うっかり画像を保存したことがあるが遅くて死んだ
825:デフォルトの名無しさん
08/12/25 16:06:11
バイナリだとクラッシュしたときの復旧がしんどいから
ちょっとしたデータのシリアライズにはyaml/storeがお気に入り。
826:デフォルトの名無しさん
08/12/25 16:09:07
とりあえず一般ユーザーはこれ使っとけ、と言えるほどのものがRubyにはまだないんだ
用途に応じて使って適宜バックアップだの負荷測定だのしなきゃならん
827:デフォルトの名無しさん
08/12/25 16:15:51
>>826
ガイドみたいなのがあるといいよね
ってるびまにあるのか
828:797
08/12/25 16:26:27
>819
mysql関係ですか,
とりあえず今夜は,sqliteで同じように実装してから
再現確認してみます.
829:デフォルトの名無しさん
08/12/25 16:51:39
>>821
>>822
begin
open("URLリンク(*****)")
rescue Timeout::Error
rescue StanderdError <<<<<某プログからのコピペまんま
rescue EOFErro
rescue Exception
rescue NameError
end
こんな感じで例外関係の対処法ググっては追加していた中で某ブログからコピペしたものが、
スペルミスしていたとは..。
即回答ありがとうございました。実は昨日からハマってました。
830:デフォルトの名無しさん
08/12/25 17:05:59
>>829
コピペうんぬんより、エラーメッセージを*よく*見て原因を考えるクセをつけようぜ!
831:デフォルトの名無しさん
08/12/25 22:03:26
Ruby学習者の「2冊目の本」、買ったやついる?どう?
832:デフォルトの名無しさん
08/12/25 22:24:03
エロティックランゲージだかなんだか副題がついてたやつか
833:デフォルトの名無しさん
08/12/25 22:26:47
今すぐ買ってくるわ
834:デフォルトの名無しさん
08/12/25 22:39:08
あれはRuby学習者というか、Rubyを使いたい人向けの本だろ
位置的に初学者本の次くらいなんじゃねーかとは言われてないわけでもないが
835:デフォルトの名無しさん
08/12/25 22:46:05
隠しても仕方ないか
Rubyで作る奇妙なプログラミング言語 ~Esoteric Language~
URLリンク(www.amazon.co.jp)
> 1-2 サンプルプログラムに特化した言語、HQ9+
> HQ9+とは
> HQ9+インタプリタを作ってみよう
> 1-3 8つの命令ですべてを記述する言語、Brainf*ck
> 1-4 決して印刷できない言語、Whitespace
> 2 Esoteric Languageを作る
> Esoteric Languageの設計と実装
> Starry言語の設計
> 付録 Esoteric Language傑作選
> Befunge、 Wierd、Shakespeare、Chef、Unlambda、Grass
> False、NULL、AAAAAAAAAAAAAA!!!!、INTERCAL、Malbolge、KEMURI、Taxi
836:デフォルトの名無しさん
08/12/25 23:09:53
なんかBFスレでは、へんな言語をネタにしたRuby入門本とか言われてたが。
...GRASS、無いのかw
837:デフォルトの名無しさん
08/12/25 23:15:39
>>836
GrassとGRASSは違う言語?
838:デフォルトの名無しさん
08/12/25 23:27:35
あ、Grassです。見えてなかったらしい。すまん。
839:デフォルトの名無しさん
08/12/25 23:34:55
新しい「プログラミング言語 Ruby」が来年の1月に出るのか。
1.9.1のリリースが迫って書籍もまた出てきそうだな。
840:デフォルトの名無しさん
08/12/26 01:05:48
RubyでSQLを用いるときってどういう時ですか?
解析させるデータ数が多いとか相互参照が多いときとかですかね?
841:デフォルトの名無しさん
08/12/26 01:11:04
リレーショナルデータベースを使うとき...というか、
どういう時にリレーショナルデータベースを使うか、という質問?
842:797
08/12/26 05:53:14
とりあえず解決したので報告です.
原因はいまだにわかりませんが
Railsのヴァージョンを
2.2.2 -> 2.1.2
へとダウングレードすることで正常動作するようになりました.
mysql postgres sqlite3
と三つ試しても同じ結果だったので,
諦めかけてましたが,
友人が作ったv2.1.2のプロジェクトを実行したとき
偶然うまくいったのがきっかけでした
843:デフォルトの名無しさん
08/12/26 11:31:16
>>840
Rubyの「メモリ内でのハッシュ構造+ディスク上でのPStoreのようなもの」ではどうにもならない場合
具体的には>>841
844:デフォルトの名無しさん
08/12/26 12:35:59
SQLの方が良い場合も歩けど
オブジェクトのままシリアライズした方が良い場合も結構ある
後者だと単純にSQLに置き換えるって訳には
845:デフォルトの名無しさん
08/12/26 23:20:20
鋸のXPathが期待した結果を出さないのだが,なぜ?
url = "URLリンク(bit.sikkou.jp)"
doc = Nokogiri::HTML(open(url))
puts doc.xpath('//b[text()="公告日"]')
「<b>公告日</b>」になるはずなのだが,
結果は空白(要するに検索できてない)
エンコードの問題でしょうか?
ちなみにスクリプト自体はUTF-8です。
846:デフォルトの名無しさん
08/12/26 23:25:17
>>845
あ~、これは誰かがどっかで説明しないといけないんだけど、Nokogiri.new は実は引数を3つとるんだよ
第3引数は文字列の文字エンコードを書く
doc = Nokogiri::HTML(open(url), nil, 'SHIFT_JIS')
って書いてみ