Ruby 初心者スレッド ..
116:デフォルトの名無しさん
09/01/06 17:37:08
0終端じゃなくて$終端だったような
117:デフォルトの名無しさん
09/01/06 17:57:59
>>116
それはファンクションコール9番の特殊仕様。
たしかキルドールが「その仕様の理由をゲイツに訊いてみな、答えられないから」と
言ってるという話を読んだ記憶がある。ソース忘れた。
118:デフォルトの名無しさん
09/01/06 18:14:47
>>117
俺もその話聞いたことがある。
同じくソース忘れたけど。
119:デフォルトの名無しさん
09/01/06 21:19:49
スレ眺めてたら自分の質問が初歩的過ぎて申し訳ないんですが、質問です。
[23,6,58,345]みたいな配列をコピペしてgetsなどで入力させるとき、
"[23,6,58,345]"となってしまって、これ自体が1つのオブジェクトとして認知されてしまうのですが、
23,6,58,345のように4つのオブジェクトとして一度に認識させる方法はあるのですか?
120:デフォルトの名無しさん
09/01/06 21:23:04
eval
でも他所様からの入力はevalしたら死ねるので注意
121:デフォルトの名無しさん
09/01/06 21:24:23
ありがとうございます
早速ためして見ます
122:デフォルトの名無しさん
09/01/06 22:06:48
>>120
おかげで完成しました。
ありがとうございます!
123:デフォルトの名無しさん
09/01/06 22:58:42
>>120
他所様の入力をevalの前に正規表現で
(\[[\d\,]+\])
とかしてからevalしても死ぬ?
124:デフォルトの名無しさん
09/01/06 23:02:02
>>123
入力がその正規表現に限定できるならそれでもいいんじゃない?
125:デフォルトの名無しさん
09/01/06 23:02:24
>>123
安全と確信できるパターンなら大丈夫いいのだが、
そのパターンだと [,,,,,,,] みたいなのを受け入れてしまわんか?
あと、$SAFEおよびtaint/untaintについても調べておくとよい。
126:デフォルトの名無しさん
09/01/06 23:05:03
>>123
数値だけなら自分でscanとかsplitととかした方が安心な気がする
127:デフォルトの名無しさん
09/01/06 23:40:58
inspect な記述を数値か文字列のどちらかの配列かハッシュに変換するライブラリとか作ったら
それなりに人気が出ると思う
128:デフォルトの名無しさん
09/01/06 23:45:14
>>127
こういうことじゃなくて?
eval({5 => 8.5, :a => 'b'}.inspect)
129:デフォルトの名無しさん
09/01/06 23:48:03
今回の記法に限れば
YAML.load('[1, 2, 3]')
=> [1, 2, 3]
とかもありかな。
130:デフォルトの名無しさん
09/01/06 23:50:36
JSONやYAMLとしてパースしてもいいんじゃない?
131:デフォルトの名無しさん
09/01/07 00:03:16
"[-1,0,1,2,3]".scan(/-?\d+/).map(&:to_i)
こんな感じでいいんじゃなかろうか
132:デフォルトの名無しさん
09/01/07 01:43:30
インスタンス変数の値を、GDBMを使ってDBへ書き込みがしたくて
こんな風に記述した。
GDBM.open(dbfile, 0644, GDBM::NEWDB){|db|
line = @number, "," ,@name, "," ,@age, "," ,@address, "," ,@tel, "," ,@grade, "," ,@department, "\n"
db[@number] = line
}
db[@number] = lineの部分で
in `[]=': can't convert Array into String (TypeError)
とエラーが出力される。
授業ではインスタンス変数の値ではなく、
CSVファイルから読み込み→DBファイルへ登録としてて、
カンマ区切りのデータならそのままDBへ書き込めるのかと解釈
したんだがそこから間違ってるのか…orz
長文スマソ
133:デフォルトの名無しさん
09/01/07 01:44:45
>>132
sage忘れた…ゴメンorz
134:デフォルトの名無しさん
09/01/07 01:48:28
いや、質問者はむしろageろ
135:デフォルトの名無しさん
09/01/07 01:58:50
>>132
>line = @number, "," ,@name, "," ,@age, "," ,@address, "," ,@tel, "," ,@grade, "," ,@department, "\n"
これは多重代入の怪しいルールでlineには配列が入るんだ
で,多分GDBMには文字列しか保存できないからこんなことになってる
だからインスタンス変数の値が全部文字列なら+でつなげるといいと思う
136:デフォルトの名無しさん
09/01/07 02:11:51
>>135
試したら先ほどのエラーは消えました!
でも + でつなげるってことはカンマ区切りなしの文字列しか
DBへ書き込みできないってことになりますか?
137:デフォルトの名無しさん
09/01/07 02:14:36
line=@number + "," + @name + "," + (以下略
こうだよこう
138:デフォルトの名無しさん
09/01/07 02:17:09
>>137
素で勘違いしてましたorz
そして出来ました!
助かりました…ありがとうございました!
139:デフォルトの名無しさん
09/01/07 06:41:18
勉強用なら、一旦配列にして結合用文字でjoinするのがスクリプトとしてもわかりやすいんじゃね、と思うぞ
data = [@number, @name, @age, @address, @tel, @grade, @department]
GDBM.open(dbfile, 0644, GDBM::NEWDB){|db|
db[data[0]] = data.join(',')
}
この場合はDBから読むときには data = db[no].split(',') とかして取り出す
結合用文字はカンマを選んだが、インスタンス変数の中に存在しない文字なら @ でも # でも ^ でも何でもいい
140:デフォルトの名無しさん
09/01/07 13:54:35
'\0' がマジおすすめ
141:デフォルトの名無しさん
09/01/07 15:09:26
>>139,140
重ね重ねありがとう!
おかげで課題出来そう
142:デフォルトの名無しさん
09/01/07 18:37:38
>>132の者です
DB関連の問題は解決したんですが、
s1 = Student.new(引数)
s2 = Student.new(引数)
とインスタンスを生成した場合、Studentクラスのクラスメソッド内で
引数の値を判断してインスタンスを返す(s1とs2どちらのインスタンスなのか判断して返す)
という処理は出来ますか?
143:デフォルトの名無しさん
09/01/07 18:45:53
>>142
そのコードの目的も含めてもうちょっと詳しく
144:デフォルトの名無しさん
09/01/07 18:50:54
そのクラス名は正直どうよと思わなくもない
生徒のもつ個人情報という意味ならふつーに StudentData とかでいいじゃんね
>>142
回答は
「クラスメソッドは @@hoge 形式のクラス変数が読めるので
インスタンスメソッドの中(今回はinitializeの中)で先頭に@を2つつけたクラス変数に値を入れておけばOK」
だけど、たぶんクラスメソッドの使い方間違ってる
でも、間違ってるということが自覚できるのはずっと先なのでまずはどんどん変な構造のスクリプト作れ
145:デフォルトの名無しさん
09/01/07 18:53:04
>>143
課題で学生クラスを生成する課題があって、
・パラメータ7つ保持(これを引数にして渡してる、7つすべて文字列)
・学生クラスのインスタンス1つは、学生1人を表す
・クラスメソッドfindによって、文字列が一致する引数を持つ
学生インスタンスを取得できること
与えられた条件はこんな感じです
146:デフォルトの名無しさん
09/01/07 18:56:00
宿題スレ向けではあるね
Rubyの宿題教えてください。2限目
スレリンク(tech板)
このスレの連中は基本ヒマで、宿題スレも見てる人はいるから答はもらえるとは思うが
147:デフォルトの名無しさん
09/01/07 18:59:20
>>146
課題では他にも色々条件が与えられていて、
他の部分はほぼ実装できてるんだけど
向こうでは>>145みたいな部分的なこと聞いてもおkなんですか?
148:デフォルトの名無しさん
09/01/07 19:06:08
むしろこの初心者スレが、前提条件とか無関係な部分的なことを聞くスレだと思う
クラスメソッドというのは、クラスで定義されたメソッドとかそういう意味ではなくて、たとえば見かけで言うと
Student.find
で動作するタイプのメソッドということでいいのだよね?
s1.find
s2.find
find
で動くタイプのメソッドを指してるつもりの言葉ではないのだよね?
149:デフォルトの名無しさん
09/01/07 19:08:33
>>148
Student.findの方です
言葉足らずですみません…
150:デフォルトの名無しさん
09/01/07 19:12:31
インスタンスを引数にとるユーティリティなメソッドとしてクラスメソッドにまとめろという課題にも思えるけど、違うんだろうな
>>149
Student.find の引数には具体的にどんなものを指定するのが妥当で、
それによってメソッドの返り値としてどんなものが返ってくるべきだと思う?
151:デフォルトの名無しさん
09/01/07 19:14:23
class Student
@@list = {}
attr_reader :name
def initialize(name)
@name = name
@@list[name] = self
end
def Student.find(name)
@@list[name]
end
end
Student.new("foo")
puts Student.find("foo").name
こんな感じか。
152:デフォルトの名無しさん
09/01/07 19:18:07
>>151
initialize の引数はたぶん7つだと思うよ
っていうか、それだと個々のインスタンス生成する意味がねえ
153:デフォルトの名無しさん
09/01/07 19:20:39
>それだと個々のインスタンス生成する意味がねえ
でも課題の内容からすると、まさにその方法を想定してるんだよな、たぶん…
154:デフォルトの名無しさん
09/01/07 19:20:41
>>152
そこまで面倒見る気はないw
クラスが自分のインスタンスのサーチをするサンプルを示しただけ。
155:デフォルトの名無しさん
09/01/07 19:24:07
>>154
サンプルありがとうございます。
でも最終的に欲しい値は>>142でいう"s1"か"s2"なんですorz
156:デフォルトの名無しさん
09/01/07 19:31:20
>>155
( ゚Д゚)<えっ
インスタンスを入れた変数の名前を文字列として知ってどうするの?
まさかevalするわけじゃないよね。
>>151で
s1 = Student.new("foo")
としたあとに
p s1
p Student.find("foo")
このふたつが等しくなるんだけど、それでも変数名が必要?
(Class.newやStruct.newは代入した変数名に依存した処理をしてるけど
あれってスクリプトレベルでできたっけ?)
157:デフォルトの名無しさん
09/01/07 19:36:22
>>155
>>150に答えて
これがしっかりしてないと外部の人間はメソッドが作れないよ
課題の一部だっていうんだから、きっとfindメソッドを他のどこかで使うんじゃないかい?
158:デフォルトの名無しさん
09/01/07 19:39:55
s1 = Student.new(引数7つ)
s2 = Student.new(引数7つ)
s3 = (ry
Student.find("引数に対して検索文字列")
# ↑ここで検索文字列を引数に持つのがs1〜s3のどれか判定
s●.他の処理
としたかったんです…
最初からこう聞いてれば良かったですねorz
159:デフォルトの名無しさん
09/01/07 19:43:34
>>158
じゃあもうひとつ
その find メソッドを作ろうと決めたのはもしかしてあなた自身?
「Studentクラスのインスタンスの集団から該当するモノを抽出する」というのが本来必要な処理だったりしない?
そのために必要だと「あなたが思ったもの」が、「Student クラスにあるべきだと考えた find メソッド」だったりしない?
160:デフォルトの名無しさん
09/01/07 19:45:01
>>157
見落としてましたorz
返ってくるべき…ということは>>158に示したのが答えでは
ダメですよね?;
161:デフォルトの名無しさん
09/01/07 19:45:46
>>158
selfっていうのはnewされたオブジェクト本体で
そのあとに代入される変数の中身そのものだから
s = Student.find("引数に対して検索文字列")
s.他の処理
これでいい。変数名は知る必要がない。
s1をひっぱりだす検索をすれば、sの中身はs1と合致する。
162:デフォルトの名無しさん
09/01/07 19:47:09
>>159
findメソッドを作るというのは課題の条件です
163:デフォルトの名無しさん
09/01/07 19:57:42
>>162
こういうのは、ふつーに作ると、こういう処理になる
s1 = Student.new(arg1)
s2 = Student.new(arg2)
s3 = Student.new(arg3)
...
students = [s1, s2, s3, ...]
hit = students.find{|s| s.name = 'なまえ'}
と書きかけて、ちょっと思う
もしかして、データの検索って>>132みたいなDBで行う?
164:デフォルトの名無しさん
09/01/07 20:03:25
質問者は名前に一貫したレス番入れてくれないか
カオスすぎる
165:デフォルトの名無しさん
09/01/07 20:03:32
>>163
>>161で出来ました!
レスくださった皆様、長々とすみませんでしたorz
166:デフォルトの名無しさん
09/01/07 20:18:19
まさに初心者スレだな。
エスパー衆、おつ
167:初心者
09/01/07 22:26:54
rubyで画像サイトを巡回して画像を保存したいです
よろしくおねがいします
168:初心者
09/01/07 22:27:33
失礼しました。
環境はシグウィンです
169:デフォルトの名無しさん
09/01/07 22:28:49
コマンドラインで動作するWebクローラをシェルスクリプト的にRubyで制御するのが近道です
ゼロまたはイチから作ることもできるけれど、おそらくそのための知識は無いことでしょう
170:デフォルトの名無しさん
09/01/07 22:31:35
>>169
それだっ(・∀・)!
171:デフォルトの名無しさん
09/01/07 22:31:58
>>169
そういや、完全初心者だった4年くらい前の頃に作った画像フェッチャは中でwgetが動いてるな
いいかげん書き換えたいんだが、問題なく動作してるし別にいいか、みたいな
HTMLとHTTP(と、情緒的Webサーバ管理)に関する知識がないと作れないからねえ
172:初心者
09/01/07 22:33:33
ユーザエージェントとかクッキーを使わなくてはいけなくて
なおかつ画像URLがリンクになっていないので自前で
解析しなくてはいけないのですが、クローラ的なものは使えますか?
wgetで挑戦したのですがサーバにはねられました。
ちなみにC++はプロです。
173:デフォルトの名無しさん
09/01/07 22:35:11
>ちなみにC++はプロです。
ならドキュメント嫁、で終了。
174:初心者
09/01/07 22:37:22
>>173
Rubyは変なキツネの漫画を読んだだけなので
どういうモジュールがあるのかとか、どういう作りにすれば
いいのかとかわけわかめです
175:初心者
09/01/07 22:39:50
Net::HTTPなるモジュールがぐぐれたので使ってみようと思います。
176:初心者
09/01/07 22:43:01
Net::HTTP.version_1_2 # おまじない
Net::HTTP.start('www.yahoo.co.jp', 80) {|http|
response = http.get('/index.html')
puts response.body
}
これでなんかアクセスできたっぽいのですが、
構文が意味不明です。
解説きぼんぬ
177:デフォルトの名無しさん
09/01/07 22:43:53
open-uri使えば。
178:デフォルトの名無しさん
09/01/07 22:46:20
Mechanizeというのがある。
Hpricotとopen-uriで満足したから使ったことないんだけれど。
179:デフォルトの名無しさん
09/01/07 22:46:37
ほんとうにC++のプロなの?
180:初心者
09/01/07 22:49:30
なるほど、open-uriもつ変えそうですね
ありがとうです
181:初心者
09/01/07 22:52:52
ブロック付きメソッド呼び出しという構文があるんですね
新しい言語は刺激的です
182:デフォルトの名無しさん
09/01/07 22:54:46
そっからかよw
183:デフォルトの名無しさん
09/01/07 22:55:20
>>178
ちゃんとリンクになってるならMechanizeも楽だけどね。
Mechanizeのメソッドを上書きして、
取得してきたHTML書き換えてリンクにしてからパースさせるという手もできそう。
184:デフォルトの名無しさん
09/01/07 22:58:41
http://で始まって.jpgとか.pngとか.gifとかで終わる文字列探すとかでも
それなりになんとかなりそうなならなそうな
185:初心者
09/01/07 23:07:24
open-uriではStringIOオブジェクトが渡されて・・・
StringIOの中味をダンプ松本したいのですが
printメソッド読んでもなにも表示されないです
186:デフォルトの名無しさん
09/01/07 23:08:36
IOはとりあえずreadだ
187:初心者
09/01/07 23:13:56
>>186
ありがとうございます。
print f.read
でいけました。
188:初心者
09/01/07 23:16:57
処々でみかける p って組み込み関数なんですね。
これはちょっと受け入れがたい衝撃でした。
タイプ量減らすためでしょうかね
189:初心者
09/01/07 23:25:10
ハ・・・ッシュ??
190:デフォルトの名無しさん
09/01/07 23:25:44
p はデバッグ用の出力関数。
タイプ量を減らすためなのは確実。
191:デフォルトの名無しさん
09/01/07 23:31:51
>>189
連想配列のこと。と言えばいいのかな。
192:デフォルトの名無しさん
09/01/07 23:33:18
まとめサイトのurl渡すと画像DLしてzipに固めるってのを以前作ったなぁ
193:デフォルトの名無しさん
09/01/07 23:33:58
根拠がないくせに「確実」だってさwwwwww
開発者がpって打ったとき冷蔵庫にザッハトルテがあることを思い出して食べてたら
うっかり忘れちゃってたのが今でもそのままになってるに決まってるんだぜ
194:デフォルトの名無しさん
09/01/07 23:35:29
だから外部プログラムのwget使え
wgetを使ったこともないような人間はそもそもまともなものを作れない
Webブラウザを使ったことのない人間がWebブラウザを作れるか?
195:デフォルトの名無しさん
09/01/07 23:37:23
最初のwebブラウザを作った人はどうしたんだ
196:初心者
09/01/07 23:38:12
std::map の特殊版みたいなもんですね > ハッシュ
metaにレスポンスヘッダが格納されているはず・・・
でもSet-Cookieが見つからない・・・
197:デフォルトの名無しさん
09/01/07 23:40:31
>>195
通信に必要な仕様を読んだ
他人に聞かないと作れないってことは、仕様の知識がないということ
仕様の知識がないのなら、他人が作ったお着せのプログラムを使い倒すことから始めるべき
それで不満が出てきてから勉強を始めても遅くはない
198:初心者
09/01/07 23:42:12
f.meta.each_key { |key| p key }
でみたら"set-cookie"で入ってました。。。
ブロックつきなんたら構文、便利ですね
199:デフォルトの名無しさん
09/01/07 23:42:36
>>193
根拠がないくせに
「決まってるんだぜ」
____
/_ノ ヽ、_\
ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ <だっておwww
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒)
| / / / |r┬-| | (⌒)/ / / //
| :::::::::::(⌒) | | | / ゝ :::::::::::/
| ノ | | | \ / ) /
ヽ / `ー'´ ヽ / /
| | l||l 从人 l||l l||l 从人 l||l
ヽ -一''''''"~~``'ー--、 -一'''''''ー-、
ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
200:デフォルトの名無しさん
09/01/07 23:48:16
>最初のwebブラウザを作った人
だれだっけ
事務クラーク?
201:初心者
09/01/07 23:48:55
グローバルスコープで変数宣言したいのですが、
cookie
だけだとundefined local variableとか怒られて
cookie = ''
だと通ったのですが、Why?
202:デフォルトの名無しさん
09/01/07 23:49:30
アラン・ケイ
203:デフォルトの名無しさん
09/01/07 23:53:54
>>201
URLリンク(ruby-lang.org)
204:デフォルトの名無しさん
09/01/07 23:54:16
>>200
ティム・バーナーズ・リー氏だと思う。
205:デフォルトの名無しさん
09/01/07 23:55:51
undefined local variableすら読めないのにC++ではプロって
あまりに恥ずかしい
仕事して金もらってれば一応プロではあるが、実力はアマチュア未満じゃないか
206:204
09/01/07 23:56:13
いや、彼はHTTP、URL、HTMLの設計だけかもしれない。。。
207:204
09/01/07 23:58:16
いや、あってた。
# 1990年11月 - ティム・バーナーズ=リーが最初のWebサーバとウェブブラウザを試作する。
# 1991年2月 - バーナーズ=リーが開発したウェブブラウザであるWorldWideWebをインターネットに公開する。
Wikipedia項目リンク
>>205
釣りじゃねーの?
208:初心者
09/01/08 00:11:06
>>205
Rubyでは未初期化での変数定義は許されないんですか?
C/C++では許されるので、そのあたりに疑問を抱いただけですが・・・
ちなみに私の書いたプログラムのユーザは全世界で数千万単位です。
209:初心者
09/01/08 00:19:47
Cookie偽装でむふふ画像のありかをしめすhtmlの取得まで
たどりつけました。
みなさまのご指導のおかげです。
画像取得&Zip化は明日にします。
どうもありがとうございました。
210:デフォルトの名無しさん
09/01/08 00:29:39
>>197
>他人に聞かないと作れないってことは、仕様の知識がないということ
>仕様の知識がないのなら、他人が作ったお着せのプログラムを使い倒すことから始めるべき
>それで不満が出てきてから勉強を始めても遅くはない
仕様の知識がないのはRubyについてで、
wgetとかHTTPの仕様には詳しそうじゃん。
wgetがRubyで実装されてるっていうなら別だが。
てかお前の読解力がなさすぎ
211:デフォルトの名無しさん
09/01/08 00:39:45
他の言語経験があるなら、仕様については人に聞かなくても
ドキュメント読めばいいだけの話じゃん。
仕様を理解するのが面倒だから人に聞いたのかも知れないけど。
212:デフォルトの名無しさん
09/01/08 01:20:21
wgetよりcurlを使ってください
213:デフォルトの名無しさん
09/01/08 01:26:49
そうそう連番jpgを落すならcurlに限る
214:デフォルトの名無しさん
09/01/08 02:33:53
Hpricotでsearchした要素から再度searchするにはどうすればいいでしょうか?
class Blog
def chk_aaa(site)
content = Array.new
site.search("div.AAA").each { |entry|
content << entry.to_s.toutf8
}
return content
end
end
site = Hpricot(open("URLリンク(hogehoge.net)").read)
aaa =Blog.new.chk_aaa(site)
上ので言えばdiv.AAAの中にdiv.BBBという要素があるときに
aaaからsearchするにはどうすればいいでしょうか?
215:デフォルトの名無しさん
09/01/08 02:37:07
>>214
entry.search
216:デフォルトの名無しさん
09/01/08 02:38:23
質問の意図がわからなくなってきた。こっちかも?
site.search("div.AAA").search("div.BBB").each
217:デフォルトの名無しさん
09/01/08 02:48:00
>>215-216
すいません。
やりたいのはaaa.search("div.BBB")なのです。
しかし、aaa.searchするにはaaaはArrayなので
それをまたHpricotに投げないといけないのかなとおもいまして・・・。
218:デフォルトの名無しさん
09/01/08 07:03:39
そんなとこでメソッド分けるなよめんどいからさ
p でいろいろ表示してみるとわかるが、Hpricot の構造は
・ parse でパースした最初のHTML … Hpricot::Doc
・ 条件などで抽出されたタグ単体 … Hpricot::Elem
・ 条件で抽出された複数のタグ … Hpricot::Elememts
になってる。で、search や at は Hpricot::Elem にも Hpricot::Elememts にも定義されてるから、
search や at をし続ける限りにおいて、メソッドチェーンは途切れない。
ということで、「chk_aaa の返り値を Hpricot::Elememts のままにしておく」が正解。
Hpricot のオブジェクトを文字列にするのは検索や抽出操作が完全に終わった最後の最後に行う。
それまでは「○○タグを表すオブジェクト(が複数詰まった配列互換の何か)」として扱うのが楽。
class Blog
def chk_aaa(doc)
return doc.search("div.AAA")
end
def pick_BBB(doc)
return doc.search('div.BBB')
end
end
doc = Hpricot(open("URLリンク(example.com)").read)
aaa =Blog.new.chk_aaa(site)
puts "aaaの最初は #{aaa[0].inner_html} だよー" # ← たとえば画面表示時に文字列にする
bbb = aaa.pick_BBB(aaa)
219:デフォルトの名無しさん
09/01/08 07:08:37
で、aaaが途中でどーしても必要でないのなら、
class Blog
def pick_BBB(doc)
return doc.search('div.AAA').search('div.BBB')
end
end
doc = Hpricot(open("URLリンク(example.com)<)"))
bbb = Blog.new.pick_BBB(doc)
としてしまうのがコンパクトだとは思う。aaa が途中で必要なのなら仕方ないけれど。
220:デフォルトの名無しさん
09/01/08 07:55:32
ああっ、ヒマだから正月中の遣り取り読んでたらなんかヒドいのがっ
>>99
> URI.escapeはURIの中に出てきたらおかしいものだけをエスケープする。
> +はURIの中に入っていても全く問題ないのでエスケープされない。
という妥当な流れから、
> +をエンコードしたいなら、CGI.escapeを使えばおk。
なんでこういう結論になるんだよ。っていうか最初にこれ言い始めた奴誰よ出てこいやオラ
>>95
URI.escape には2番目の引数がある。以下マニュアル
> URI.escape(str[, unsafe])
> URI 文字列をエンコードした文字列を返します。
> unsafe には、URI として指定できない文字を正規表現か文字列で指定します。
ということで
require 'uri'
url = 'URLリンク(www.google.com)'
p URI.escape(url).to_s
p URI.escape(url,'+').to_s
とすると
"URLリンク(www.google.com) "
"URLリンク(www.google.com) "
になる。CGIのエスケープはURIエスケープの代わりにはできないから、これにすべき。
221:デフォルトの名無しさん
09/01/08 08:04:54
御説ごもっともだが、それだと URI::UNSAFE が消えるぞ
irb> puts URI.escape('URLリンク(example.com)ねこだいすき', '+').to_s
URLリンク(example.com)ねこだいすき
irb> puts URI.escape('URLリンク(example.com) だいすき', Regexp.union(URI::UNSAFE, /\+/)).to_s
URLリンク(example.com)
うーん、めんどくさいっすな
222:デフォルトの名無しさん
09/01/08 14:03:24
#!/usr/bin/ruby -Ku
require 'jcode'
s = '平成21年1月1日~平成21年12月31日'
p s.split('〜')
s = '平成21年1月1日~平成21年12月31日'
p s.split('~')
なんですが、全角の〜では分割できない?
ruby 1.8.6 (2008-03-03 patchlevel 114)です。
223:デフォルトの名無しさん
09/01/08 14:12:30
ruby 1.8.6 (2008-03-03 patchlevel 114) [universal-darwin9.0]
["平成21年1月1日", "平成21年12月31日"]
["平成21年1月1日", "平成21年12月31日"]
できたよ。
Unicodeの全角チルダ(FULLWIDTH TILDE)と波ダッシュ(WAVE DASH)の区別が
どーのこーのという問題だろうか。
224:デフォルトの名無しさん
09/01/08 14:22:44
・ スクリプトが UTF-8 ではない
・ 2バイト文字…ああ、Unicode だから2とは限らないのか…の正規表現には u をつける
p s.split(/〜/u)
というのはどうだろ
225:222
09/01/08 14:45:13
>>223
>>224
サンクス
p s.split(/〜/u)でうまくいった
226:デフォルトの名無しさん
09/01/08 21:28:38
>>218-219
ありがとうございました.
やりたいことはブログタイトルや個々のエントリを構造体に入れて,構造体.エントリ.searchのようにしたかったので
aaaが発生するようになりました.
まず,returnのさいにHpricot::Elementsで返すようにして修正していこうと思います.
227:デフォルトの名無しさん
09/01/08 22:00:20
226がhpricotのこと言ってるからついでに
href内にcat_xxxxx.htmlがあるaの要素をsearchするにはa[*=cat_]だけでOK?
これでやるといらないところまでついてくるんだよな
228:デフォルトの名無しさん
09/01/08 23:30:43
Rubyの調べ方について質問です
例えば
URLリンク(blog.codezine.jp)
を読んでいると
(doc/:h1).each do |h1|
のような表記が出ます
これについて自力で調べたいのですが、Googleは記号類を無視するようで
これが何かわからないと調べることができません
そのようなときに、皆様はどう調べていますか?
この例だと、/:h1って何だとかです
h1はHTMLのタグなのは判りますが、なぜ文字列として""で囲まないのか
また each do |h1|の|h1|は何だとか
これは例ですが、Rubyを最近使い始めてこういうところで困っています
何かいい方法があればご教授下さい
229:デフォルトの名無しさん
09/01/08 23:38:23
Google先生の性癖はよくわからんが、俺だったら
Ruby "/:"
みたいにクォーテーションで括るかな。
230:デフォルトの名無しさん
09/01/08 23:40:51
: はシンボルを表すやつで、
/ は除算演算子をオーバーロードしたものじゃないのか?
/: で一塊じゃないはずだ。
まあ、普通はリファレンスマニュアルの索引で調べるよ。
231:デフォルトの名無しさん
09/01/08 23:44:36
Rubyを始めたばかりでhpricot使っちゃったのが不幸の始まりとしか
232:デフォルトの名無しさん
09/01/08 23:44:40
ここでの/はHpricotのメソッドだね。
searchの別名だ。
最近始めたばかりというならもう少し基礎やる時間を作ればいいと思う。
233:デフォルトの名無しさん
09/01/08 23:44:59
(doc/:h1).each do |h1|
の場合、
doc →Hpricot::Doc のインスタンス
/ →docのインスタンスメソッド(/演算子の多重定義)
:h1 →/ の第2引数であるシンボル
|h1| →eachに与えられたブロックの単なる引数の名前
と、まず構文の要素を正しく認識しなきゃいかんね。
234:デフォルトの名無しさん
09/01/08 23:50:34
>>228はCSSセレクタやXPathをRubyマニュアルで調べるに一票
235:デフォルトの名無しさん
09/01/08 23:51:24
ソース追うのに慣れてなければ
irb 上で実行して, それぞれの変数にどんなオブジェクトが入ってるのか調べるのも大事
p object.class
p object
みたいな感じで
まあわかる人ならソース追うのが一番だけど
236:デフォルトの名無しさん
09/01/08 23:54:22
>>234
うわああああああ説明めんどくさああああ
>>231がそのまんまだな
237:デフォルトの名無しさん
09/01/08 23:55:18
>>228
ぐぐる以前に、そのページのコードの前にある参考ページに全部
書いてあるじゃん。
一般論としてということであれば、やっぱりぐぐる以前にリファレンスなり
入門なりを読むべきでしょう。
238:デフォルトの名無しさん
09/01/09 00:17:42
XP SP3、Ruby 1.8.6、エクセル2003使用者で、WIN32OLEを使ったプログラムを書いてるんですが、
エクセル操作の命令をメソッドの定義内で書いたときにエクセルのメソッド名?に空白が
含まれているものだとエラーが出てうまく動きません。
例:
def hoge
excel.Sheets(2).Select
end
は正しく動くのですが、
def fuga
excel.Sheets(2).Move After = excel.Sheets(1)
end
は"Move After"の"Move"と"After"の間に空白が入っているために
”dynamic constant assignment”というエラーが出てしまいます。
スペースをなくしたりするとこのエラーは消えますが、当然他のエラーが出ます。。
おそらく空白があるために後ろの"After"を定数と認識しているのではないかと思うんですが、どうなのでしょうか?
色々なエクセルのメソッドを自作のメソッドに定義して呼び出して一度に実行、みたいなことをさせたいと思っているんですが
文法上メソッドの定義内でこういったエクセルのメソッドを定義するのは無理なのでしょうか?
何かうまい解決策がありましたらご教授お願いします。
239:デフォルトの名無しさん
09/01/09 00:32:02
>>238
> おそらく空白があるために後ろの"After"を定数と認識しているのではないかと思うんですが、どうなのでしょうか?
その通り
スペース含んでたりしてRubyがメソッド名としてうまくパースしてくれないときは Object#send を使うといい
excel.Sheets(2).send('Move After') = excel.Sheets(1)
ただWIN32OLEでExcel使ったことないから動作確認はしてない
240:デフォルトの名無しさん
09/01/09 00:37:19
おなじくExcelは詳しくなくて申し訳ないが
MoveがメソッドでAfterは引数だって情報が引っ掛かったのよ
()でくくってみるってのはどう?
241:デフォルトの名無しさん
09/01/09 00:39:38
win32oleは使ったことないが多分invoke使うべきだろう
URLリンク(doc.loveruby.net)
242:デフォルトの名無しさん
09/01/09 00:42:06
>>229
でも>>228の該当部分の構文要素を分解すると、
「doc」「/」「:h1」なんだよな……。
243:238
09/01/09 01:07:01
>>239
助言ありがとうございます。
教えていただいた方法を試してみたのですがダメでした・・・
syntax error, unexpected '=', expecting kEND
excel.Sheets(2).send('Move After') = excel.Sheets(1)
>>240
助言ありがとうございます。
Move(After)ってことですよね。こちらも同様にダメでした。。
syntax error, unexpected '=', expecting kEND
excel.Sheets(2).Move(After) = excel.Sheets(1)
>>241
助言ありがとうございます。
これも同様にダメでした・・・orz
syntax error, unexpected '=', expecting kEND
244:デフォルトの名無しさん
09/01/09 01:10:32
そもそもメソッドの返り値に代入なんかできないからね
245:238
09/01/09 01:13:01
すみません、>>243に書き忘れていましたが、
>>241
excel.invoke('Sheets(2).Move After') =excel.Sheets(1)
excel.Sheets(2).invoke('Move After') =excel.Sheets(1)
excel.Sheets(2).Move.invoke('After') = excel.Sheets(1)
と試してみましたがすべて下記のエラーでした。
syntax error, unexpected '=', expecting kEND
246:227
09/01/09 01:17:37
わかりにくかったかもしれないから再度。
たとえば
URLリンク(blog.livedoor.jp)
ここのカテゴリの部分の要素を抜き取りたいのです。
div.entry-categoryで抜き出せばいいのですけど、複数あった場合はだめで、
複数あった時の共通するのはURLにcat_xxxxx.htmlとなります。
ので、hrefにcat_があればその要素を抜き出したいのですが・・・
247:227
09/01/09 01:20:36
わかりにくいかもしれませんね。
<a href="URLリンク(example.com)カテゴリ</a>
<a href="URLリンク(example.com)カテゴリ2</a>
のカテゴリ、カテゴリ2を抜き出したいです。
248:デフォルトの名無しさん
09/01/09 01:23:08
あーVBにキーワード引数が有ってそれをそのまま書こうとしてハマってるのか
多分こうだ
excel.Sheets(2).Move("After" => excel.Sheets(1) )
URLリンク(homepage1.nifty.com)
249:初心者
09/01/09 01:28:42
>>247
inner_htmlでおkです
250:227
09/01/09 01:31:10
>>249
inner_textだとカテゴリ,カテゴリ2と抜き出せるのですがね。
URLにcat_を含むaタグのinner_textを抜き出したいのです。
251:238
09/01/09 01:32:54
>>248
出来ました!
ありがとうございます!!
なるほど、そんな書き方があったんですね。
これで他のキーワード引数付きのメソッドも問題なく使えそうです。
本当にありがとうございましたm(_ _)m
252:デフォルトの名無しさん
09/01/09 01:33:11
a要素を全部取ってきてselectすれば?
253:228
09/01/09 01:44:46
みなさま、ありがとうございます
>>229
クオーテーションでくくっても、その場合Rubyのみの検索と同じです
Javaのように、やたら長いAPIだとぐぐると一発で出てくるのですが
>>230
>>232
オーバーロードだったのですね
リファレンスは見てみましたが、該当するものを見つけられませんでした
お手数をおかけしました
>>231
そうかも知れませんが、mechanizeを使うことが結構大きなモチベーションでした
>>233
丁寧にありがとうございます
|h1|はここに限らずよく使う構文ですので何となく判るのですが
一例として、これも調べるのに苦労したことがあります
使うだけなら、黙って書き写せばいいのだけど、欲張ると急に難しくなる
>>234
ありがとうございます、CSSセレクタとかは詳しくはないものの別件で調べてみました
>>235
mechanizeは結構複雑で苦労していますが、よくやっています
>>237
ごもっともですが、こういうとき普通はどう調べるのかなと疑問に感じました
Rubyは便利な機能が多いのですが、他人のコードを見て何をしているのか
今のところ自分の理解を超えているものが多く、読み解くヒントが欲しかったのです
254:デフォルトの名無しさん
09/01/09 02:03:14
>>227
XPathで
//a[contains(@href, "cat_")]
という風に指定すれば意図している要素が得られる
が,HpricotのXPath対応がお粗末だから(少くとも手元のHpricotでは)うまくいかない
そこで,>>252が言うように
search('a').select{|a| /cat_/ =~ a['href']}.map{|a| a.inner_text}
みたいな感じでごまかしとけばいいんじゃない?
まあ,nokogiri使えばXPathでうまくいくかもね
255:デフォルトの名無しさん
09/01/09 02:28:09
ソース見て分からないってのは基礎が出来てないからだと思うから、
詳細な解説付きの本でも読む事を勧める。
いちいちソースの解説求めてたら、答えるほうも大変だし飽きるでしょ。自分で調べて苦労してないからすぐ忘れて何度も同じ事訊くだろうし。
256:227
09/01/09 02:29:12
>>252,>>254
ありがとうございます。
search('a').select{|a| /cat_/ =~ a['href']}.map{|a| a.inner_text}
でやりたいことができました。
XPATHの方はnokogiriいれてやってみます!
257:デフォルトの名無しさん
09/01/09 03:29:21
自分のサイトのアドレスを取得する方法ってりあますか。
直にURL記述している部分があって、サーバ変えた際に色々と書き換えなどめんどうなので、
この部分をプログラムが今動いているサーバ(サイトURL)アドレスを取得して使ってくれるようにしたいのですが。
258:227
09/01/09 04:45:41
何度もすいません。
div.abcかdiv.efgがある場合に抽出するにはsearch("div.abc||div.efg")でよいのでしょうか?
それかsearch("div.abc")がnilになった時にsearch("div.efg")するように分岐させればよいのでしょうか?
いまいち論理演算の使い土器がわからないです。
259:デフォルトの名無しさん
09/01/09 04:49:38
>257
その方法を考える前に「直にURLを記述」するのを1回だけにするのはどうよ。
コードの頭の辺りで定数として入れておいて、後はコード内で補完って感じで。
そうすると書換えの時も1回で済むし、無駄なアクセスも増えないから重くもならないかと。
260:デフォルトの名無しさん
09/01/09 04:54:26
url=URLリンク(yoursite.net)みたいにね。
外部参照(だっけ?)できるようにすればそれ参照すればいいんじゃね?
261:デフォルトの名無しさん
09/01/09 05:53:39
>>257
どんなフレームワーク使ってるかわからんけど
クライアントのリクエスト情報が入ったインスタンスの中を探せばあるだろ
WEBrick::HTTPRequest#hostとかCGI#server_nameとか
262:デフォルトの名無しさん
09/01/09 06:34:16
>>258
search の引数には「CSSセレクタ」か「XPath」が使える(Hpricot独自の拡張も入ってるが)
どちらも「HTMLとかのタグの位置を表記する方法」だ(大雑把)
というわけでCSSセレクタの使い方でも調べとけ
他人にいちいち書き方を聞くことはなくなるだろう
263:デフォルトの名無しさん
09/01/09 06:54:42
>>257
定数ENVの中に何かいいの入ってるかも
さくらインターネットと自前のLANサーバでスクリプトを共有させてたときは
LOGIN_NAMEで初期値変えてたなあ
264:デフォルトの名無しさん
09/01/09 07:25:17
>>257
奥の手
require 'open-uri'
open('URLリンク(forts.jp)').read.strip
265:デフォルトの名無しさん
09/01/09 08:59:47
ruby で argv を書き換える方法ってありますか?
Cだと **argv をいじると、プロセス一覧(ps等)に反映されるのですが ruby でも同じことをやりたいです
266:デフォルトの名無しさん
09/01/09 12:11:12
$0
267:デフォルトの名無しさん
09/01/09 12:41:44
>>257
RackならRequest#urlがある
268:デフォルトの名無しさん
09/01/09 15:46:56
>>259
>>260
>>261
>>263
>>264
>>267
とりあえずファイルに設置サーバのアドレス書き込んで、
それから読み出して使うように処理変えることにしました。
色々とアドバイスありがとうございます。
269:デフォルトの名無しさん
09/01/09 17:03:54
>>265
$0 = 'winny'
OSによっては駄目かもしれない。
270:デフォルトの名無しさん
09/01/09 17:29:53
Mechanizeで教えてください。
ブラウザでサイトに接続。
あるフォームをポストすると,ファイルがダウンロード。
そのページはかわらずそのまま。リンクやボタンをクリック可能。
(あたりまえといえばあたりまえなのですが)
という作業をMechanizeでやろうとしてます。で
agent = WWW::Mechanize.new
agent.get(hogeサイト)
agent.submit(agent.page.form(hogeフォーム))
agent.page.bodyでファイルを取得
なのですが,この段階で,agent.pageのクラスが
WWW::Mechanize::Fileになってしまって,agent.page.backとかもできない。
フォームをsubmitする前のところから,次の作業をするにはどうすればいいでしょうか?
reserve=agent.get(hogeサイト)
みたいにしても,reserveは参照だから,同じでした。
271:デフォルトの名無しさん
09/01/09 17:34:24
transactとかあったような
272:デフォルトの名無しさん
09/01/09 17:36:59
めんどくさいなあ
見た目に簡単なのは、WWW::Mechanize#transact を使うこと
URLリンク(d.hatena.ne.jp)
ブロック開始時の履歴が保存されて、ブロック終了時に書き戻される
agent.get(hoge_uri)
agent.transact{|a|
a.page.form_with(:method => value).click_button.save_as(path_to_save)
}
agent.page # hoge_uriを維持
273:デフォルトの名無しさん
09/01/09 17:45:14
リクツとしてわかりやすいのは、WWW::Mechanize#visited_page
URLリンク(d.hatena.ne.jp)
URL を引数に渡すと、そのURLにアクセスしたときの Page オブジェクトを履歴から探してきて返す
agent.get(hoge_uri)
agent.page.form_with(:method => value).click_button.save_as(path_to_save)
agent.visited_page(hoge_uri).links_with...
agent.page の代わりに agent.visited_page(hoge_uri) を使うことで、いつでも過去の Page オブジェクトを引き出せる
いちいち書くのめんどい場合は
prev_page = agent.visited_page(hoge_uri)
とでもして変数に入れとけ
あ、Mechanize 0.8.5 より前の Mechanize を使ってる場合は form_with(:method => value) や click_button が動かないんで、
代わりに forms.method(value) や submit 使ってくれ
274:デフォルトの名無しさん
09/01/09 17:56:07
transact ってそう使うのか
275:デフォルトの名無しさん
09/01/09 18:01:50
>>274
たぶん、そもそもこういう用途向けに作られたんじゃないかと思われる
トランザクションと銘打っておきながらブロック内で履歴が新規に開始されていない
(ブロック直前のページがブロック内初回アクセスのリファラ候補になってる)あたりが怪しい
276:デフォルトの名無しさん
09/01/09 18:08:08
>>267
Rack(笑)
Rackって使ってる人多くない感じがセンデロルミノソ
277:デフォルトの名無しさん
09/01/09 18:13:10
個々に好きなの使ってる感じは嫌いではない俺
278:デフォルトの名無しさん
09/01/09 18:48:50
プログラミング言語 Ruby
David Flanagan, まつもと ゆきひろ 著 、卜部 昌平 監訳、長尾 高弘 訳
2009年01月24日 発売予定
URLリンク(www.oreilly.co.jp)
> 1章 イントロダクション
> 2章 Rubyプログラムの構造と実行
> 3章 データ型とオブジェクト
> 4章 式と演算子
> 5章 文と制御構造
> 6章 メソッド、proc、lambda、クロージャ
> 7章 クラスとモジュール
> 8章 リフレクションとメタプログラミング
> 8.5 フック
> 8.6 トレーシング
> 8.7 ObjectSpaceとGC
> 8.8 カスタム制御構造
> 8.9 method_missingとconst_missingの活用
> 8.10 メソッドの動的な作成
> 8.11 エリアスチェイン
> 8.12 ドメイン固有言語(DSL)
> 9章 Rubyプラットフォーム
> 9.1 文字列
> 9.2 正規表現
> 9.3 数値と数学
> 9.4 日付と時刻
> 9.5 コレクション
> 9.6 ファイルとディレクトリ
> 9.7 入出力
> 9.8 ネットワーキング
> 9.9 スレッドと並列処理
> 10章 Ruby環境
279:デフォルトの名無しさん
09/01/09 18:52:07
>>278
これもっと早く出すべきだったんじゃね?
なにこのわかった人向けの基本の解説本
280:デフォルトの名無しさん
09/01/09 18:55:58
>>278
> 2.4 プログラムのエンコーディング
> 2.4.1 プログラムのエンコーディングの指定
> 2.4.2 ソースエンコーディングとデフォルト外部/内部エンコーディング
> 3.2 文字列
> 3.2.6 文字列のエンコーディングとマルチバイト文字
お。
281:デフォルトの名無しさん
09/01/09 19:04:33
Matzが直接本を書くのは、1.6ごろの宝石本以来?
282:デフォルトの名無しさん
09/01/09 19:18:29
それとほとんど内容同じ鴨試練
283:デフォルトの名無しさん
09/01/09 19:23:42
今のバージョンに合わせた内容にしてるだけだろうな。
それでも大きな違いはあるだろうけど。
284:デフォルトの名無しさん
09/01/09 19:26:58
良くも悪くも目次が「普通+言語作者周辺が語るディープツッコミ」で終わってるからな
285:デフォルトの名無しさん
09/01/09 20:13:07
本の最初の部分で「他の言語経験がなく、これからRubyでプログラミングを始める人を対象とする。」みたいに
書いてあるが、実際にはまったくのプログラミング初心者には向かないかもしれない。
一番不思議に思ったのは、練習問題。
ふつう、その章に出てくる練習問題は、その章までに学んだことを応用できるような
問題にするべきなのに、Stringクラスの練習問題では、次の章に出てくるハッシュや
正規表現を使わせる問題が出てくる。
これじゃプログラミング初心者はつまずいてしまうのではないだろうか。
なんとなく、プログラミングの感覚を「Ruby」に染めさせるような本に思えてくる。
286:デフォルトの名無しさん
09/01/09 20:15:58
プログラミングPerlもプログラミング初心者が1ページ目から読むようにはできてなかった気がする
(まああれは厚さも問題だが)
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5503日前に更新/246 KB
担当:undef