Ruby 初心者スレッド ..
[2ch|▼Menu]
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ページ目から読むようにはできてなかった気がする
(まああれは厚さも問題だが)

287:デフォルトの名無しさん
09/01/09 20:51:12
>>278
100冊カートに入れた。
そしてカートから出した。

288:デフォルトの名無しさん
09/01/09 21:11:27
カートには99冊残ってるわけか

289:デフォルトの名無しさん
09/01/09 21:11:31
いまRubyマニュアルを読めてるような人には有り難味の薄い書物であるように見える

290:デフォルトの名無しさん
09/01/09 21:13:03
>>289
購入者の6割はお布施だと思うよ

291:デフォルトの名無しさん
09/01/09 21:14:15
原著を斜め読みした限りでは、初心者向けの本ではない。
1.9の解説書として考えるのが妥当だと思う。

292:デフォルトの名無しさん
09/01/09 21:18:23
>>288
それは必ず成り立つのですか?

293:デフォルトの名無しさん
09/01/09 21:19:34
詳説Rubyと名付けるのが妥当

294:デフォルトの名無しさん
09/01/09 21:20:49
オライリーの "プログラミング#{言語名}" という本は総じてガチ初心者お断りだから、
間違って買ってしまう人以外は平気だと思う

295:デフォルトの名無しさん
09/01/09 21:22:04
設計者の書いた本は、仕様と同時に言語の思想とかも与えてくれるから
バイブル扱いされやすい気がする
K&R、ラクダ、D&Eみたいに・・・・・本家amazonの評価が異様に良いのも気になる

296:デフォルトの名無しさん
09/01/09 21:23:12
>>293
だよなぁ・・。

なんかこう、プログラミング初心者向けですよ〜みたいなこと言っておいて
「プログラミングの世界ってどんなんだろう?」という純粋な初心者が、いつのまにか「Rubyだけの世界」に洗脳されそうだ。
もっとプログラミングの本質にこだわった本かと思ったのに。。

297:デフォルトの名無しさん
09/01/09 21:28:58
プログラミングの本質に触れたいなら特定の言語名を冠した本は違うと思うな。
といってプログラミングの初心者にそれを理解しろってのは酷だけど。

298:デフォルトの名無しさん
09/01/09 21:31:12
>>297
> プログラミングの本質に触れたいなら特定の言語名を冠した本は違うと思う
URLリンク(www.amazon.co.jp)
イエスこの本マジお勧め

299:デフォルトの名無しさん
09/01/09 21:33:12
>>298
それなんでRuby採用したんだろうな

300:デフォルトの名無しさん
09/01/10 01:51:35
> Rubyは変なキツネの漫画を読んだだけなので
www
ホワイの感動的なやつだな

>>205
C++のプロは「C++のプロ」とは自分で言わんだろ。
自称「C++のプロ」と言えばなんとなくニュアンスはわかる

301:デフォルトの名無しさん
09/01/10 02:40:12
>>285
>ふつう、その章に出てくる練習問題は、その章までに学んだことを応用できるような
>問題にするべきなのに、Stringクラスの練習問題では、次の章に出てくるハッシュや
>正規表現を使わせる問題が出てくる。
>これじゃプログラミング初心者はつまずいてしまうのではないだろうか。

それは既にhashや性器表現を知ってるからそう思うだけで教育的効果はあると思うよ
初心者の場合hashや性器表現を使わずにその問題を解こうとして悩むのがいい
そうすれば次の章で出てくるhashや性器表現の意味や必要性を理解しやすい
唐突にhashや性器表現が出てくる方が初心者は混乱する

>なんとなく、プログラミングの感覚を「Ruby」に染めさせるような本に思えてくる。

どの辺が?

302:デフォルトの名無しさん
09/01/10 02:43:11
>>300
大学生のときは上には上がいる、というか、上しかいない状況だったが、
就職してからは、下が果てしない、というか、下しかいない状況だった。
プログラミングで食ってりゃプロなのは間違いないが、それとスキルは直結しない。

303:デフォルトの名無しさん
09/01/10 02:52:58
まつもとゆきひろって2ちゃんねるの管理人だった人?

304:デフォルトの名無しさん
09/01/10 03:33:40
>>301
ネタとわかってても性器表現が気になってしょうがないんだがw

305:デフォルトの名無しさん
09/01/10 07:07:39
>>302
下ばっかり見てると腕落ちますよ

306:デフォルトの名無しさん
09/01/10 09:24:05
rubygemsってどう呼ぶんですかね?
ルビィゲムズ?

307:デフォルトの名無しさん
09/01/10 09:28:57
>>306
gem(ジェム): 宝石。宝玉。
URLリンク(dictionary.www.infoseek.co.jp)


308:デフォルトの名無しさん
09/01/10 09:44:34
>>307
d

309:デフォルトの名無しさん
09/01/10 13:08:05
>>266
>>269

遅くなりましたがありがとうございます!!
perl と同じなんですね
助かりました!

310:デフォルトの名無しさん
09/01/10 13:10:27
>>301
なるほどね。

311:デフォルトの名無しさん
09/01/10 14:01:03
青空文庫形式のテキストを処理しています。
青空文庫形式では親文字とルビを次のように書いています。

 |親《おや》|文《も》|字《じ》

これを一つにまとめる形で、

 |親文字《おやもじ》

という形に変換(置換処理)したいのですが、どうすれば良いでしょうか。
親文字が幾つあるかは一定していません。
この処理を一行毎に行いたいのです。

312:デフォルトの名無しさん
09/01/10 14:59:15
>>311
irb> s = '|魑《ち》|魅《み》|魍《もう》|魎《りょう》が|跋《ばっ》|扈《こ》する'
irb> 1 while s.gsub!(/|(.*?)《(.*?)》|(.*?)《(.*?)》/, "|¥¥1¥¥3《¥¥2¥¥4》")
=> "|魑魅魍魎《ちみもうりょう》が|跋扈《ばっこ》する"

gsub!は置換が行われればレシーバ(s)を、行われなければnilを返す。
1っていうのはとくに意味はない。後置whileを繰り返すためだけの存在。


313:デフォルトの名無しさん
09/01/10 15:13:57
s.gsub(/(|.+?《.+?》)(?!|)/){"|%s《%s》" % $1.scan(/|(.+?)《(.+?)》/).transpose}

正規表現であまり悩みたくない人向け

>>312
gsub の第 2 引数は使うなとお達しが来てるはずだが

314:デフォルトの名無しさん
09/01/10 15:27:57
初心者スレで transpose と sprintf 使って手抜きしてる人には言われたくないだろうな

s.gsub(/(|.+?《.+?》)(?!|)/){
base = Array.new
ruby = Array.new
$1.scan(/|(.+?)《(.+?)》/){|m|
base.push(m[0])
ruby.push(m[1])
}
# 以下の文字列が gsub(re){str} の str に当たるもの
"|#{base.join('')}《#{ruby.join('')}》"
}

前にも gsub の 2番目の引数使ってた人がいたけど同一人物かね
無駄にエスケープ連打せずにブロック使えという認識になってたと思う




315:デフォルトの名無しさん
09/01/10 15:42:35
>>312
s = "|日《に》|本《ほん》|語《ご》の|漢《かん》|字《じ》"
1 while s.gsub!(/|(.*?)《(.*?)》|(.*?)《(.*?)》/, "|\\1\\3《\\2\\4》")
puts s

|日本語字《にほんご》の|漢《かんじ》


316:デフォルトの名無しさん
09/01/10 15:43:46
> gsub の第 2 引数は使うなとお達しが来てるはずだが
kwsk

317:デフォルトの名無しさん
09/01/10 16:28:35
正規表現で漢字のかんむりやへんやつくりをマッチさせるにはどうするんですか?

318:デフォルトの名無しさん
09/01/10 16:32:31
>>317
無茶言うな

どっかの誰かに「部首と漢字文字との対応表データ」を作ってもらうしかないね
ネット上には適当なデータを作ってる熱心な人がいるから、それをRubyでどうにか使うしか

319:デフォルトの名無しさん
09/01/10 16:37:40
発想としては斬新でけっこう好きだ
その視点を失わずにプログラミングして欲しいなと思う

320:デフォルトの名無しさん
09/01/10 17:11:49
このスレの少し前でRackの話が出てたけど
実際のところ、Rackって日本ではどのくらい使われてるんだろうね
日本語の解説記事もいくつかあるから、少なくともドマイナーって程ではないと思うが

321:デフォルトの名無しさん
09/01/10 17:49:37
流石って
さす+が
さ+すが
どっちになってます?

322:デフォルトの名無しさん
09/01/10 17:56:54
>>321
熟字訓だから「さすが」で分かれない
明日が「あし - た」でも「あ - した」でもないのと同じ

323:デフォルトの名無しさん
09/01/10 19:33:38
(3.2-2.0) == 1.2 がfalseの理由を教えて下さい。

324:デフォルトの名無しさん
09/01/10 19:34:58
>311です。皆さんありがとうございました。

325:デフォルトの名無しさん
09/01/10 19:47:19
>>323
等しくない
たぶん浮動小数点数の誤差のせい

irb(main):024:0> sprintf("%.16f", 3.2 - 2.0)
=> "1.2000000000000002"
irb(main):025:0> sprintf("%.16f", 1.2)
=> "1.2000000000000000"

326:デフォルトの名無しさん
09/01/10 19:51:08
>>323
浮動小数点だから

何かを計算した結果の浮動小数点の値と、
それ以外の数式で何かを計算した(あるいは計算していない)浮動小数点の値が、
全く同じになるというようなことはふつう無い

だから、小数を含んでいる数値は絶対にイコールで比較してはいけない

どうしても比較したい場合は、たとえばその差を誤差並に小さな数 Float::EPSILON と比較する

irb> (3.2 - 2.0) -1.2 < Float::EPSILON
false
irb> (3.2 - 2.0) -1.2 < Float::EPSILON*10
true

10倍や100倍以内なら同じ数値とみなしてよい

327:デフォルトの名無しさん
09/01/10 19:53:11
>>323
なるほど。
てことは、浮動小数点数の比較は安易にするなってことですかね。


328:デフォルトの名無しさん
09/01/10 19:55:18
>>326
ありがとうございます!
そうゆうもんなんですね。
PHPから入った素人なんで、勉強になりました。

329:デフォルトの名無しさん
09/01/10 19:55:38
あ、いかん、絶対値とらないと

((3.2 - 2.0) -1.2).abs < Float::EPSILON*10

こういうのでよろしこ

330:デフォルトの名無しさん
09/01/10 19:55:47
rubyに限らず実数の比較をしないってのは基本
おおむね>>326の通りなんだけど、欲を言えば絶対値を取っておくほうがいい

331:デフォルトの名無しさん
09/01/10 19:57:40
厳密じゃなくていいのなら、文字列にして比較してしまうというのがいいかもしれん
一般的な用途では文字レベルでしか判断しないからな

irb> (3.2-2.0).to_s == 1.2.to_s
true

332:デフォルトの名無しさん
09/01/10 20:29:17
なぜ文字列にして比較を??
数値の比較の話じゃなかったの?

333:デフォルトの名無しさん
09/01/10 20:59:37
>>332
文字列は

てか浮動小数点の指数の基数って
初心者の頃はずっと10なんだと思ってた。
で、なんで誤差が発生するんだとさんざん悩んでみたり
今からしたら俺アホかと




334:デフォルトの名無しさん
09/01/10 21:02:00
しまったメインの話題を途中やめにしてた

数値を文字列に変換する過程である程度の誤差を丸めてくれるなら、
>>329みたいな過程を記述する必要がないってこと

たとえruby内で記録されている値が
1.19999999999 であっても
1.20000000001 であっても
表示するときは最下位を丸めて 1.2 になると。

浮動小数点はちょっとわかりにくいからwikipediaで調べてみそ
URLリンク(ja.wikipedia.org)浮動小数点数

335:デフォルトの名無しさん
09/01/10 21:05:56
irb> (3.2 - 2.0) -1.2 < Float::EPSILON
false
これが true になるような左辺ってあるんだろうか

336:デフォルトの名無しさん
09/01/10 21:09:41
左辺が絶対値ってことだと思うが左辺の方が小さかったらEPSILONの意味がないな


337:デフォルトの名無しさん
09/01/10 21:10:10
0では?

338:デフォルトの名無しさん
09/01/10 21:11:50
nil?

339:デフォルトの名無しさん
09/01/10 21:19:19
URLリンク(www.google.co.jp)

ちょびっと逆転してる

340:デフォルトの名無しさん
09/01/10 21:20:10
URLリンク(www.google.co.jp)

間違えたこっちだった

341:デフォルトの名無しさん
09/01/10 21:27:17
>>332
目に見える範囲の小数が等しいかどうかを調べるだけなら
これが「我々がアタマの中で考えてる」処理に一番近い

どちらが大きいかということが必要な場合はあまり(あるいは全く)使えないので用途に注意

342:デフォルトの名無しさん
09/01/10 21:32:43
>>335
irb> (5.5 - 2.25) - 3.25 < Float::EPSILON
=> true

343:デフォルトの名無しさん
09/01/10 21:40:17
>>326
<=にしたらtrueになった

irb> (3.2 - 2.0) -1.2 <= Float::EPSILON
true

344:デフォルトの名無しさん
09/01/10 21:41:18
>>342
それは単に 0.0 なのでは
0.5 も 0.25 も割り切れてるもの

345:デフォルトの名無しさん
09/01/10 22:25:21
Float::EPSILON < Float::EPSILON
false

Float::EPSILON <= Float::EPSILON
true

0.0 < Float::EPSILON
true

って話?


346:デフォルトの名無しさん
09/01/10 22:27:51
Float::EPSILON とは <= で比較するのが正しいのかな


347:デフォルトの名無しさん
09/01/10 22:30:50
A <= B と A < B || A == B の動作違うのってまずくね

348:デフォルトの名無しさん
09/01/10 23:00:14
rubyってDLL作れる?

rubyで作ったプログラムをVBAやC#みたいな他ので使いまわせるようにしようと思ったら
どういう形式がいい?

349:デフォルトの名無しさん
09/01/10 23:05:35
>> 336
マシンイプシロン Float::EPSILON は
1.0 + Float::EPSILON != 1.0
になる最小の数って意味だから違う。

IEEE754 の浮動小数点表現では、32 ビットの単精度でも指数部は 8 bits、仮数部 23 bit あるから
EPSILON はせいぜい 2.0**(-23) 程度

>> Float::EPSILON + 1.0 == 1.0
=> false
>> Float::EPSILON/2 + 1.0 == 1.0
=> true
>> 1e-20 < Float::EPSILON
=> true

だから、ちゃんと比較するなら絶対値で割ってから比較するべき
abs((a-b)/b) < Float::EPSILON
とか。b < Float::EPSILON のときの処理も必要だけど。



350:デフォルトの名無しさん
09/01/10 23:23:19
1.0 + Float::HOGE == 1.0
になる最大の値 HOGE のことを何と言いますか

351:デフォルトの名無しさん
09/01/10 23:25:12
マシンウプシロン

352:デフォルトの名無しさん
09/01/10 23:29:49
Delphiだと引数にEpsilonを指定できる浮動小数用の比較関数(SameValueだっけか)が
あるんだけど、Rubyにはないのん?

いちいち絶対値とってそれがEpsilon以下って書かなきゃならない?
組み込みかライブラリであれば教えて頼む

353:デフォルトの名無しさん
09/01/10 23:32:30
URLリンク(i.loveruby.net)

354:デフォルトの名無しさん
09/01/11 00:00:41
Ruby Cookbookに載っているコード

class Float
def approx(other, relative_epsilon=Float::EPSILON, epsilon=Float::EPSILON)
difference = other - self
return true if difference.abs <= epsilon
relative_error = (difference / (self > other ? self : other)).abs
return relative_error <= relative_epsilon
end
end

100.2.approx(100.1 + 0.1) # => true
10e10.approx(10e10+1e-5) # => true
100.0.approx(100+1e-5) # => false

355:デフォルトの名無しさん
09/01/11 00:04:56
浮動小数点を比較しなきゃ逝けない用途って何?
コンピュータに向いてない作業の一つだな。

356:デフォルトの名無しさん
09/01/11 00:14:26
シミュレーション?

357:デフォルトの名無しさん
09/01/11 00:27:31
RubyでGUIアプリケーションは作成可能でしょうか?
友人からは、GUIアプリケーションは
VC++、VBとかじゃないと無理と聞いたのですが・・・

358:デフォルトの名無しさん
09/01/11 00:37:12
>>340
日本ではまだまだ遠いな
URLリンク(www.google.co.jp)

359:デフォルトの名無しさん
09/01/11 00:37:34
>>354
self と other を比較する前に絶対値とらないと駄目なんじゃ。

360:デフォルトの名無しさん
09/01/11 00:38:08
def check(name)
/name/ =~ "hiroyuki"
以下略

で/name/ をnameでマッチさせるのではなく引数の値を使うにはどうすればいいでしょうか?


361:デフォルトの名無しさん
09/01/11 00:50:37
>>357
スレリンク(tech板:302-312番)

362:デフォルトの名無しさん
09/01/11 01:08:45
ここまでBigDecimalへの言及無し。
URLリンク(www.ruby-lang.org)

irb> require 'bigdecimal'
=> true
irb> BigDecimal.new("3.2") - BigDecimal.new("2.0") == BigDecimal.new("1.2")
=> true


363:デフォルトの名無しさん
09/01/11 01:11:56
浮動小数点数の比較の話をしてるんだからBigDecimalの出る幕は無いだろ

364:デフォルトの名無しさん
09/01/11 01:20:00
>>354
サンクス。組み込みではないっつーことか。

>>355
まーゲーム作るときとかちょっとした数値計算、
後ユニットテスト書くときなんかにはいるけど、
確かに最後の例以外Rubyには不適だかなあ

365:デフォルトの名無しさん
09/01/11 01:21:22
>>360
def check(name)
name =~ "horioyuki"

で、
check呼ぶ時に正規表現リテラル渡せばよいのでは?
check(/.+oyu.+/)

366:デフォルトの名無しさん
09/01/11 01:26:58
ちょっとお聞きしたいのですが、
wikiとかの表示によくあるプログラムの実行時間を
自分のスクリプトで表示したいのですが、
簡単にmsecの実行時間を測る方法はないでしょうか?

スクリプトの終了前に
puts Process.times.to_yaml
とかやってみたんですが、表示がさっぱり?です。
utimeとstime を足したものが実行時間なのかな?

367:デフォルトの名無しさん
09/01/11 01:28:51
あれは単にWikiテキストの処理開始時と
処理終了時の差を取っただけなんじゃないか?

368:デフォルトの名無しさん
09/01/11 01:31:14
>>366
基本的な計測はbenchmarkライブラリ(標準添付)でOK
あと、「Ruby プロファイラ」で検索すると色々出てくる

369:デフォルトの名無しさん
09/01/11 01:33:47
>>363
おおもとは、>>323
> (3.2-2.0) == 1.2 がfalseの理由を教えて下さい。
だから、小数を含む数の扱いについて一通り言及すべきだと思うんだ。

370:デフォルトの名無しさん
09/01/11 01:40:08
>>365
nameに渡す文字列はARGV.shiftで受け取ったものなんですよ・・・。
グローバル変数にすればよかったりしますかね・・・。


371:370
09/01/11 01:54:40
グローバルしてみましたが結局 =~ の 左辺,右辺に変数がきてもいいのでしょうか?

372:デフォルトの名無しさん
09/01/11 02:10:29
def check(name)
/#{name}/ =~ "hiroyuki"
end

p check("hiroyuki") # => 0

373:370
09/01/11 02:17:30
>>372
ありがとうございました!!!!!!!!!うまくいきました。
=~の左辺の#{name}っていうのは変数としてみるってことですか?

374:デフォルトの名無しさん
09/01/11 02:18:34
>>368
サンクス
benchmarkクラス使ってみる

375:デフォルトの名無しさん
09/01/11 02:28:14
>>373
まあそんな感じだ
「式展開」について勉強すればよくわかる
URLリンク(www.ruby-lang.org)

376:デフォルトの名無しさん
09/01/11 02:28:22
変な質問なうえにおそらく出来ないんだろうけど一縷の望みをかけて質問
メソッドの入れ子って出来ますか?
たとえば、
def method1
 処理
 def method2
  処理
 end
end
としたら、method1だけ呼びだしたらmethod1の処理のみで終了。
method1.method2みたいに呼びだしたら両方の処理を実行、みたいな。

この書き方だと
URLリンク(www.ruby-lang.org)
みたいになっちゃうから無理なのは明白だけど・・・

method1に引数を与えてmethod2の処理をif文でくくって引数の値で処理するか否かを
決めるって方法もあるけど、見た目的にごちゃごちゃするから嫌というか・・・

なんかいい方法あったら教えてください。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5503日前に更新/246 KB
担当:undef