Ruby 初心者スレッド Part 44

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

前スレ Part 43 http://hibari.2ch.net/test/read.cgi/tech/1305973297/

★注意★ Ruby 1.9.2 は初心者には若干時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
 文字エンコーディング等の外部基礎知識が必要な上、不完全対応の第三者ライブラリでの問題の切り分けが手間です。
 迷う点の少ない1.8.7に習熟→おもむろに1.9.2の変更点のみ重点学習、とすればスムーズに移行できるでしょう。

関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・エラーメッセージの共通そうな部分やエラーの出るモジュール名でググる
 ・マニュアルで引っかかったクラスの記述を探す http://www.ruby-lang.org/ja/man/
 ・FAQを一応読む http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
回答してくれた人には「ありがとう」のひとことをいってあげて。

■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
2デフォルトの名無しさん:2011/06/12(日) 11:32:39.08
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がありますか?

A:
プログラム作成自体の初心者なら
・「たのしいRuby 第3版 Rubyではじめる気軽なプログラミング」
http://www.amazon.co.jp/gp/4797357401/

文法は理解済み(orリファレンスで乗り切る既言語習得者)の場合のRuby様式を知る必携2冊目
・「初めてのRuby」
http://www.amazon.co.jp/dp/4873113679/

以下は外れが少ないとされている本です。必ず立ち読みした上で自分の目的とレベルに応じて購入してください。
・「Rubyレシピブック 第3版 303の技」(初心者向け、1.9対応)
http://www.amazon.co.jp/dp/4797359986/

・「プログラミングRuby 第2版 言語編」(初心者向け参考書)
http://www.amazon.co.jp/dp/4274066428/

・「Ruby Way 第2版」(脱初心者向け)
http://www.amazon.co.jp/dp/4798115339/

・「Rubyクックブック ―エキスパートのための応用レシピ集」(脱初心者向け)
http://www.amazon.co.jp/dp/4873113245/

以下の本は言語作者が書いた最新本ですがとりあえず初学者向けではありません。
・「プログラミング言語 Ruby」(言語として深く知りたい人向け)
http://www.amazon.co.jp/dp/4873113946/
3デフォルトの名無しさん:2011/06/12(日) 11:39:47.30
Ruby 公式・非公式便利サイト2011

・Ruby Home Page 【公式、お役立ち度が微妙】
 http://www.ruby-lang.org/ja/
・旧Rubyリファレンスマニュアル
 http://www.ruby-lang.org/ja/man/
・るりま(新マニュアル、未完成)
 http://redmine.ruby-lang.org/projects/rurema/wiki 【配布元】
 http://doc.okkez.net/ 【Web版】
・英語版マニュアル
 http://www.ruby-doc.org/
・Programming Ruby - The Pragmatic Programmer's Guide 【好評書籍の初版がネットで、ただし英語】
 http://www.ruby-doc.org/docs/ProgrammingRuby/
・Rubyist Magazine - るびま 【ライブラリ紹介などの読み物、過去のコードレビューは一読の価値あり】
 http://jp.rubyist.net/magazine/

・逆引きRuby 【やりたいことから探すWiki、最近元気ないので編集者募集】
 http://www.namaraii.com/rubytips/
・はてなキーワード > Ruby 【うっかりどっさりまとまったリンク集、説明なし】
 http://d.hatena.ne.jp/keyword/Ruby

・RubyForge 【○○をやりたい管理されたライブラリを探すならここ、英語】
 http://www.rubyforge.org/
・GitHub 【○○をやりたいコードをとにかく探すならここ、英語】
 http://github.com/

・日本Rubyの会 【最近はオフライン勉強会の寄り合い場と化しているので近くで勉強会があれば】
 http://jp.rubyist.net/
4デフォルトの名無しさん:2011/06/12(日) 11:41:48.63
これからRubyを勉強するなら1.9.x系を使いましょう
もはや1.8.x系はメンテナンスのみになります
5デフォルトの名無しさん:2011/06/12(日) 11:50:38.27
たのしいRubyのURL訂正
http://www.amazon.co.jp/dp/4797357401/

関連スレはめんどくさいので必要だと思う人がどうぞ
6デフォルトの名無しさん:2011/06/12(日) 11:54:35.35
7デフォルトの名無しさん:2011/06/12(日) 12:06:54.79
アフィリンクが1個貼ってあるだけで拒絶反応とかどんだけ嫌儲だよ
8デフォルトの名無しさん:2011/06/12(日) 12:09:50.83
これは中の人乙だなw
9デフォルトの名無しさん:2011/06/12(日) 12:15:39.00
まあ別にコピペしただけなんで不快なら次スレから抜いてくれれば

>>3はなくてもそんな困んないだろうし。
10デフォルトの名無しさん:2011/06/12(日) 12:19:45.36
>>8
嫌儲でぐぐれ
11デフォルトの名無しさん:2011/06/12(日) 12:38:36.65
>>10
>嫌儲は、自身が所属するインターネットコミュニティ内の共同制作物を第三者が個人的利益のために無断借用をする行為に対して嫌悪感を持つことである。そのため、当該コミュニティに対する帰属意識が高いほど顕著に現れる傾向がある。
12デフォルトの名無しさん:2011/06/12(日) 12:45:35.15
嫌儲(けんもう、けんちょ)とは金儲けを悪と考える思想、感情、もしくはその活動、態度、それを行う人物、団体を示すインターネットスラングである。

嫌儲 けんちょ

人が儲ける行為を嫌うこと。

嫌儲とは特にインターネットにおいて、金儲けが絡む活動・宣伝を嫌うことを表した言葉である。


別に「自身が所属する〜」はそれが典型的なパターンってだけで必須の条件じゃないな。
13デフォルトの名無しさん:2011/06/12(日) 12:49:05.17
なんで新スレ早々こんなクソみたいな話題で盛り上がってんの

やっぱり>>3は要らんな
14デフォルトの名無しさん:2011/06/12(日) 13:02:10.18
http://ja.wikibooks.org/wiki/Ruby

嫌儲的にはいっそのことここが充実したらいいのか
15デフォルトの名無しさん:2011/06/12(日) 14:11:58.14
Gogofmtみたいなソースコードを整形してくれるツールはありますか?
特にEmacsから使えるツールを探しています。
ただインデントするだけじゃなくて、
class Ruby   ←こういう後ろの空白も削除されてほしいです。
 def foo(bar)
  @bar =bar←こういうイコールの左右の空白もそろえて欲しいです。
 end
    ←こういう改行もなくして欲しい。

end
16デフォルトの名無しさん:2011/06/12(日) 17:03:39.96
条件を満たしるかどうかまでは知らないが

Ruby Script Beautifier
http://www.arachnoid.com/ruby/rubyBeautifier.html

という整形ツールがあるらしい。

ってかせっかくテキスト処理に優れたRuby使ってんだから
自分でスクリプト書けばよくね?
17デフォルトの名無しさん:2011/06/12(日) 17:04:52.60
ではイコールの左右の空白を整えられるよう
さくっとパースしてみてください
18デフォルトの名無しさん:2011/06/12(日) 17:06:52.25
UniversalIndentGUI もRubyに使えるらしいですよ
19デフォルトの名無しさん:2011/06/12(日) 17:24:59.34
両方半角1個にしてしまっていいなら

str.gsub!(/(\s+)?(=の前にセットで付く可能性のある記号群)?(=)(\s+)?/){ " #{$2}#{$3} " }

こんなんで出来るんじゃないすかね。試してないけど。

文字列リテラルやコメントを排除したり、揃え方に条件つけるのはご自分でどうぞ。
20デフォルトの名無しさん:2011/06/12(日) 17:33:37.76
rubyってそれほどテキスト処理に優れてるかなあ?

言語解析ライブラリは無いし、文字コード判定も外部任せダゾ。
21デフォルトの名無しさん:2011/06/12(日) 17:35:59.95
テキスト処理と言語解析って全然別物だぞ
22デフォルトの名無しさん:2011/06/12(日) 17:47:28.16
Raccがあるじゃないか。使ったこと無いけど

>>19
最後のをすっぽかしたら誰でも書けるけどそれじゃ何の役にも立たない
23デフォルトの名無しさん:2011/06/12(日) 17:50:10.74
getsしているときにIDEの候補選択みたいの出来るライブラリってないですか
IRBみたいなヒストリではなく
24デフォルトの名無しさん:2011/06/12(日) 18:04:39.57
文字コード判定を、なんでライブラリでやって悪いんだ? 言語がそんなもの抱える必要があるんだ?
形態素解析がしたいならMeCabでも茶筅でもJumanでもライブラリあるから使えばいいし。
>>20 は全く意味不明
25デフォルトの名無しさん:2011/06/12(日) 18:16:48.33
>>22
別に「簡単にできる」なんていった覚えはないから、
コメントやリテラルの退避まで書く義理はない。
「イコールの左右の空白を整えられる」処理を書いただけ。

揃え方の条件つけるのは条件が提示されていない以上ご自分で、
としか言えない。エスパーじゃないからな。
26デフォルトの名無しさん:2011/06/12(日) 18:27:14.93
>>16のRuby Script Beautifierは
文字列やコメントの退避をしてくれるようだから、
これを改造すればお望みの整形ツールになるんじゃないかなあ。
27デフォルトの名無しさん:2011/06/12(日) 19:43:17.21
前スレ、CSVはRFC4180で規格化されてるよ。

問題はその後で付いてるレスの通り、
誰が従うのかってところだわな。
28デフォルトの名無しさん:2011/06/13(月) 00:11:56.02
配列の場合は無限に拡張し続けるコードを
書かない限りは問題が無いので
イテレート中の要素追加は自己責任で

ハッシュの場合は限定個のキーを追加するだけでも
領域拡張が発生してリハッシュでイテレート順が変化して
正常に列挙し続けることができない可能性があるからエラーにする

などと考えたけど、1.9では順番も保持してるので
がんばって実装したら配列と同程度には安全になりそうな気がするが
なにがまずいのだろう?
まさか実装が面倒だからだったりじゃないだろうな

ひょっとして他の処理系で実装しにくいからとか?
「binding_of_callerはJRubyで実装しにくいから不採用」だったような気が
29デフォルトの名無しさん:2011/06/13(月) 00:14:37.09
外部イテレータ使えカス、で終わる話のようにも見える
30デフォルトの名無しさん:2011/06/13(月) 00:17:41.86
残念ながら、イテレータが内部、外部であろうと問題は変わらないよ
31デフォルトの名無しさん:2011/06/13(月) 00:31:12.92
>>27
CSVは本当はエスケープまわりが小難しいんだということが周知されないと問題はよくならねえ
ライブラリを通じての読み書き以外は今後数年間禁止で
XMLを手作業でゼロから書く人がいないのと同レベルで、CSVを手作業で読み書きしてはならない
32デフォルトの名無しさん:2011/06/13(月) 02:09:00.56
うるせえな初心者スレッドで語ってんじゃねえ
33デフォルトの名無しさん:2011/06/13(月) 02:36:14.08
Ruby1ヶ月程度の俺でもわかる話題なのに
34デフォルトの名無しさん:2011/06/13(月) 04:09:25.93
>>23
Readline.completion_proc=
35デフォルトの名無しさん:2011/06/13(月) 14:08:20.80
Windows Ruby1.9.2
指定した時刻まで待機する処理を行いたいのですが
PHPでいうとhttp://php.net/manual/ja/function.time-sleep-until.phpのようなことをRubyでできませんか
36デフォルトの名無しさん:2011/06/13(月) 14:14:42.38
Time.nowと指定したい時刻の差をとってその秒数だけsleepすればいいんじゃないの?
37デフォルトの名無しさん:2011/06/13(月) 14:21:27.43
sleepは精度悪いから指定した時間を前後するよ
38デフォルトの名無しさん:2011/06/13(月) 14:34:41.40
>>37
以前の1.8系列のWindows用はやばかったけど、
今手元で試したら1.8.7も1.9.2まともだったよ。
ミリ秒単位だとOSのAPI直接呼んでもどうしようもないしね。
39デフォルトの名無しさん:2011/06/13(月) 14:35:43.56
>>35
Rubyでタスクスケジューラに登録すればいい
マシンの時刻を司ってるOSがタイマー処理してくれるから、
Rubyスクリプト起動にかかる時間を考えなければ時刻的には理想的に動作するぞ

秒数を間違って欲しくないなら、>>36をやって10秒くらいごとに補正かけ続けないと安心できない
40デフォルトの名無しさん:2011/06/13(月) 14:37:37.38
現在が指定した時刻か判断→違っていたら1秒スリープ、で永久ループ
41デフォルトの名無しさん:2011/06/13(月) 14:40:59.00
>>40とかぶるけどこんなのがお手軽だね

loop do
 break if Time.now > (Time.strftimeとかして指定した時刻)
 sleep 0.1
end
42デフォルトの名無しさん:2011/06/13(月) 14:47:44.63
基本的に時間関係はOSさんに聞くしかないからなあ。

1.指定時刻までOSに現在時刻聞きまくりつづけて指定時刻以降だったらbreak
2.現在時刻と指定時刻の差をとってその時間だけ眠らせといてよ、とOSに頼む
3.現在時刻と指定時刻の差をとって一定値S以上ならSだけスリープ、
 差が一定値S以下ならその値だけスリープしてからbreak

みたいな方法しかない。

内臓されてる言語でも内部ではそういう感じの処理をしているだろうし。
43デフォルトの名無しさん:2011/06/13(月) 15:15:25.90
localhostにアクセスするとCGIで動的に文字列(半角英数字)を生成します
print "aaa\n"
print "bbb\n"
print "ccc\n"
print "\0"

# coding: Windows-31J
require "socket"
socket = TCPSocket.open("localhost", 80)
get = "GET / HTTP/1.1\r\n"
get += "Host: localhost\r\n"
get += "Connection: Close\r\n\r\n"
socket.puts get
while buf = socket.gets
puts buf
end
socket.close

上記は「ruby ソケット」でググってコードを書いてみて、サーバにソケット通信して文字列を表示するコードです。
これを\0が来るまでwhileでループをするように書き換えたいのですがご教示お願いいたします
44デフォルトの名無しさん:2011/06/13(月) 15:18:41.56
一応whileの中にif文で判定したらできるのですが
先生方のお知恵を拝借させてください
while buf = socket.gets
if "\0" == buf then
puts "null"
break;
end
puts buf
end
45デフォルトの名無しさん:2011/06/13(月) 15:20:09.65
60 - Time.now.sec秒スリープしながら時刻チェック
46デフォルトの名無しさん:2011/06/13(月) 15:30:48.97
>>44
一行の途中に"\0"があるケースは考えなくていいの?

while buf = socket.gets
 if idx = buf.index "\0"
  puts buf[0...idx]
  break
 else
  puts buf
end
end
47デフォルトの名無しさん:2011/06/13(月) 15:38:37.83
文字列中には\0がこないように削除します(ヌルバイト攻撃対策のため)
最後に\0を出力(\0の後に改行も入れない)するので取得した値が\0であれば終了という形でやりたいです
48uy ◆yyC0rYWEq2 :2011/06/13(月) 16:17:03.25
while( (buf = socket.gets) != "\0")
puts buf
end

while(buf = socket.gets)
break if buf == "\0"
puts buf
end

s="shshfsnana\0usjsjs"
s =~ /(.*)\0/
p $1
49デフォルトの名無しさん:2011/06/13(月) 16:37:49.89
>>48
一番目はsocket.getsがnilを返す可能性があるから
二番目のほうがいいだろね
50デフォルトの名無しさん:2011/06/13(月) 16:47:26.39
whileの中でifで判定するしかないですね
ありがとうございます
51デフォルトの名無しさん:2011/06/13(月) 17:08:29.18
FINパケットじゃだめなん
52デフォルトの名無しさん:2011/06/13(月) 19:48:13.67
FINパケットの使い方がわかりません
53デフォルトの名無しさん:2011/06/13(月) 21:13:37.40
自分がここで勉強してきたことをまとめていくのって良い事ですか?
ここの先生方は初心者時代の頃はやりましたか?
54デフォルトの名無しさん:2011/06/13(月) 21:27:21.07
>>51
アプリケーション層のプロトコルの話としては関係ないと思うよ。
55デフォルトの名無しさん:2011/06/13(月) 21:49:02.46
(1)
a = ["a","b","c","d","e",1,2,3,4,5]
b = a[rand(a.size)]
puts b
これはエラー出ません

(2)
b = ""
5.times{
b += a[rand(a.size)]
}
puts b
と書くとエラーになります

(3)
b = ""
5.times{
b += a[rand(a.size)].to_s
}
puts b
と書くとちゃんと表示されます
何故(1)ではエラーにならないのに(2)でto_sを書かなかったらエラーになるのでしょうか?
56デフォルトの名無しさん:2011/06/13(月) 21:56:12.78
TypeError: can't convert Fixnum into String
Rubyは暗黙的な型変換イカんでしょ
57デフォルトの名無しさん:2011/06/13(月) 21:56:48.72
>>55
(1)では、bには文字列が代入されたり、整数が代入されたりする。
どちらが入っていても、putsが勝手にto_sするので問題は生じない。

(2)では、bには最初から文字列が入っている。
文字列と+で連結できるのは文字列そのもの(と、to_strが定義されているオブジェクト)だけで、
(2)でa[rand(a.size)]が数値になったときに
文字列 + 数値
の式が生じてエラーになる。

can't convert Fixnum into String

エラーメッセージもたまには読んであげて。
58デフォルトの名無しさん:2011/06/13(月) 21:59:00.88
String#+
59デフォルトの名無しさん:2011/06/13(月) 21:59:08.08
>>55
「と書くと」じゃなくて「と書いた場合にrand(a.size)が5〜9になると」だろ
bは文字列なのにaには数値も入ってるんだからto_sがなきゃそりゃエラー出るわ
「数値」は「数字」じゃないってこととエラーメッセージが出たらとりあえず丸ごと検索窓に突っ込んでみることを覚えろ
60デフォルトの名無しさん:2011/06/13(月) 22:00:03.64
(1)でもきちんと同じように書けばTypeErrorが出る

b = ""
b = b + 1
61デフォルトの名無しさん:2011/06/13(月) 22:00:35.76
自分の環境では(2)はundefined local variable or method `a' for main:Object (NameError)がでました
62デフォルトの名無しさん:2011/06/13(月) 22:01:43.95
>>61
(1) を実行してから (2) をやることを意図してる
っていうか、それもきんとエラー読もうよ
63デフォルトの名無しさん:2011/06/13(月) 22:01:55.31
>>61
a = ["a","b","c","d","e",1,2,3,4,5]
ぐらいは補ってやれよ
64デフォルトの名無しさん:2011/06/13(月) 22:03:39.98
>>56
厳密に話し始めると、to_strがあるからその辺は微妙じゃね?
言語として型付けが強いのは間違いないんだが、
暗黙の型変換っぽい挙動もライブラリ次第で認めてしまう
65デフォルトの名無しさん:2011/06/13(月) 22:03:46.43
僕にはRubyが難しいようです
66デフォルトの名無しさん:2011/06/13(月) 22:09:06.99
"1" + 1がエラーになる言語もあればそうでない言語もある
RubyやPythonは前者、PerlやPHPは後者に属する
そういう決まりになってるってだけのことだよ
67デフォルトの名無しさん:2011/06/13(月) 22:09:42.99
>>55
まずは、もうちょっと問題の切り分けが出来るようになった方がいい
randのような不確定要素を先に排除することを考える
68デフォルトの名無しさん:2011/06/13(月) 22:11:14.35
>>66
awkみたいに文字列をゼロ扱いする言語もあるし……
もう言語によってやりたい放題
69デフォルトの名無しさん:2011/06/13(月) 22:22:22.54
>>64
できないじゃなくていけないというのはまあそれなりに正しいと思うよ。
to_strとかto_aryとか、よっぽどでないと使っちゃいけない。
70デフォルトの名無しさん:2011/06/13(月) 22:31:22.34
>>68
awkはよく知らないけど
「文字列も場合によっては0として扱われる」じゃない?

% echo 1 | awk '{print 1 + "hello"}'
1
% echo 1 | awk '{print 1 + "10"}'
11
71uy ◆yyC0rYWEq2 :2011/06/13(月) 22:35:36.01
class Fixnum
  def to_str 
    self.to_s
  end
  def + s
    self--s.to_i
  end
end



a = ["a","b","c","d","e",1,2,3,4,5]
b = a.sample
puts b
b = ""
5.times{
b += a.sample
}
b = ""
5.times{
b += a.sample.to_s
}
puts b 
72デフォルトの名無しさん:2011/06/14(火) 11:31:02.13
ファイルに記録したXMLを整形して別のファイルに保存したいのですがファイルに書き込めませんでした
どなたかお助けください

require "rexml/document"
xml = open("./a.xml") {|f|
f.read
}

doc = REXML::Document.new(xml)
formatter = REXML::Formatters::Pretty.new(2)
formatter.write(doc, "./xml.txt")
73デフォルトの名無しさん:2011/06/14(火) 11:38:54.53
中間形式にすることを厭っちゃダメよ
文字列なら File.open(path, 'wb'){|f| f.print(str)} で書き込めるというのはわかってるんだから、
ライブラリ独自の処理はとりあえず無視して、書き込みたい文字列を返してもらうようにすればいい
74デフォルトの名無しさん:2011/06/14(火) 11:54:15.99
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
75デフォルトの名無しさん:2011/06/14(火) 12:03:32.85
失礼しました
Windows XP sp3 Ruby1.9.2

require "rexml/document"
xml = open("./a.xml") {|f|
f.read
}

doc = REXML::Document.new(xml)
formatter = REXML::Formatters::Pretty.new(2)
a = ""
formatter.write(doc, a)
open("./b.xml", "w") {|f|
f.write a
}
こうやるとxmlを整形してファイルへは書き込み出来ますが
何故formatter.write(doc, "./xml.txt")でファイルに書き込めないのかがわかりません
76デフォルトの名無しさん:2011/06/14(火) 12:10:58.24
>>72
REXML::Formatters::Pretty#write(node, output)
はoutputにパスを渡されたらそのファイルを開いてそこに書き込むなんて動作はしない。

"./xml.txt"という文字列を生成してその末尾にテキストを書き込ませてそのまま捨ててるから
ファイルに書き込まれようはずもない。

s = ''
formatter.write(doc, s)
File.open('./xml.txt', 'w'){|f| f.write(s)}

とするか、

File.open('./xml.txt', 'w') do |f|
 formatter.write(doc, f)
end

としないとだめ。
77デフォルトの名無しさん:2011/06/14(火) 12:17:11.26
>>75
"./xml.txt"はファイルとは関係ないただの文字列だから。

formatter.write(doc, "./xml.txt")
のどこでファイルを開いてるの?

formatter.writeは第二引数に「書き込み可能なオブジェクト」を受け取って、
そこに書き込んでいくだけ。

文字列を渡せばその文字列オブジェクトに書き込むだけだし、
書き込みモードのIOオブジェクトを受け取ればそこに出力する。

文字列を渡したときにパスとして妥当か判定して
パスの形式になってたらファイルを開いて書き込んで、
そうでなければ文字列に直接書き込むみたいなめんどくさい動作はしてくれないっす。
78デフォルトの名無しさん:2011/06/14(火) 12:22:32.91
現実的には
formatter.write(doc, $stdout)
させておいて出力先はリダイレクトで、とする方が使いやすい気がしなくもない。
79デフォルトの名無しさん:2011/06/14(火) 12:31:04.73
REXML::Formatters::Pretty#write がめんどくさい動作になってるってだけの話だったりもする

>>75
write(node, output) の内部で output << to_string(node) をやってるからだよ
output は << 可能なオブジェクトでなければならない

まあ、若干不親切ではある
マニュアルには書いてあるけどね
> output::
> # An object implementing '<<(String)', to which the output will be written.
80デフォルトの名無しさん:2011/06/14(火) 12:36:12.23
まあつまり
formatter.write(doc, "./xml.txt")は
"./xml.txt<xml>\n <nantoka>\n <kantoka>txt</kantoka>\n </nantoka>\n</xml>"
みたいな文字列作って捨ててるだけってことですな。
81デフォルトの名無しさん:2011/06/14(火) 12:40:11.05
たくさん繰り返すループの中で同じ内容の文字列や正規表現を使うときは
やっぱりループ内にリテラル書くより、
ループ前に変数か定数に代入しといて
ループ内では参照するだけにした方がいいの?
82デフォルトの名無しさん:2011/06/14(火) 12:40:24.38
>>79で終了
っていうか、REXMLなんて無理してまで使わんでよろしい
ファイルサイズにもよるけど、パースにかかる時間で require 'nokogiri' のお釣りが来るぞ
83デフォルトの名無しさん:2011/06/14(火) 12:43:47.96
>>81
答はNOだ
ブロックの外の変数や定数を参照するのは、ブロック内のローカル変数を参照することよりもわずかにコストが高い
ループ内に直書きしたほうが、速度的にはちょっと速い
万単位のループでは、ちょっと効いてくる

あと、 #{埋め込み} のない完全リテラルな /正規表現/ は Ruby がコンパイル畤に記憶するから何も考えなくていい
84デフォルトの名無しさん:2011/06/14(火) 12:50:34.37
>>81
試してみたよ。

require 'benchmark'

S = 'String'

Benchmark.bm(10) do |x|
 x.report('CONST:'){200000.times{s = S}}
 x.report('LITER:'){200000.times{s = 'String'}}
end

        user   system   total     real
CONST:   0.031000  0.000000  0.031000 ( 0.031250)
LITER:   0.078000  0.000000  0.078000 ( 0.078125)
85デフォルトの名無しさん:2011/06/14(火) 12:56:09.13
>>84
そのテストは文字列生成のコストがかかっているから不正だ

# -*- coding: utf-8 -*-
require 'benchmark'

S = 12345

Benchmark.bm(10) do |x|
x.report('CONST:'){2000000.times{s = S}}
x.report('LITER:'){2000000.times{s = 12345}}
end

user system total real
CONST: 2.080000 0.010000 2.090000 ( 2.314962)
LITER: 1.630000 0.000000 1.630000 ( 1.813098)
86デフォルトの名無しさん:2011/06/14(火) 12:58:48.01
例によって Ruby 1.9 では誤差レベルだな
よく頑張ったもんだ
87デフォルトの名無しさん:2011/06/14(火) 12:59:38.44
>>83
ってわけで、文字列については処理内容によるんじゃないかしら。

ループ内でもともと捨てオブジェクトがあまり発生しないなら
オブジェクトが生成されまくり捨てられまくるコスト>ブロック外の定数参照のコスト

>>85
いやなんで整数なのよ。
>同じ内容の文字列や正規表現を使うときは
整数ならリテラル書いてもオブジェクト増えないからリテラルが速いの当たり前だわ。
88デフォルトの名無しさん:2011/06/14(火) 13:00:44.74
これ動きません
何でですか?

require "tk"

TkLabel.new {
text "Hello!!"
width 10
height 10
pack
}

Tk.mainloop
89デフォルトの名無しさん:2011/06/14(火) 13:02:31.96
>>88
>>1
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
90デフォルトの名無しさん:2011/06/14(火) 13:03:31.77
どうせTcltkが入ってないとかそういう……。
91デフォルトの名無しさん:2011/06/14(火) 13:04:16.15
>>87
じゃあ正規表現リテラル(埋め込みなし)でもいいよ
>>83の言う通り、完全にリテラルな正規表現は1回しか生成されないから結果同じだけど…

っていうか、スコープとびだすときにかかる参照コストの話でもないのね
92デフォルトの名無しさん:2011/06/14(火) 13:04:21.96
ruby 1.9.2p180 (2011-02-18) [i386-mingw32]って出てきました
93デフォルトの名無しさん:2011/06/14(火) 13:05:14.52
>>92
スクリプト実行時のエラーメッセージ
94デフォルトの名無しさん:2011/06/14(火) 13:07:52.60
こうです
<internal:lib/rubygems/custom_require>:29:in `require': no such file to load -- tk (LoadError)
from <internal:lib/rubygems/custom_require>:29:in `require'
from C:/stadyruby/test.rb:1:in `<main>'
続行するには何かキーを押してください . . .
95デフォルトの名無しさん:2011/06/14(火) 13:11:01.35
>>91
>スコープとびだすときにかかる参照コストの話でもないのね
てか実際はそのへんとオブジェクト生成コストの差し引きの結果がどうなるかであって、つまりは>>87なんじゃね
96デフォルトの名無しさん:2011/06/14(火) 13:12:36.86
>>91
負けず嫌いだなあ。
文字列では先に代入しといた方が速いんだよ。

正規表現や整数は先に生成しとくって特別仕様なだけ。
浮動小数点数でも毎回生成されるからリテラルの方が遅いよ。

まあ、わかりにくいから、変数や定数に代入すべき理由が他にないときは
微妙に遅かろうがリテラル使う方がいいとは思うけど。
97デフォルトの名無しさん:2011/06/14(火) 13:17:26.26
およ、2回書いたら2回生成されるからループの中でも毎回生成するかと思いきや、
ループ内ではFloatは1回しか生成されないらしい。
98デフォルトの名無しさん:2011/06/14(火) 13:33:36.40
この問題は以前話題になったことがあって、結論は

・埋め込みアリの正規表現は埋め込むものが毎回同じならループ内にリテラルで書いてはいけない
・文字列の場合は先に代入すると微妙に速いが影響は大きくないので他の条件次第
・整数や埋め込みのない正規表現、小数なんかはベタでリテラル書いちゃえ

と最初からわかってるんでそこんとこよろすこ
99デフォルトの名無しさん:2011/06/14(火) 13:35:50.84
>>94
環境にTcltkが入ってないんじゃね
100デフォルトの名無しさん:2011/06/14(火) 13:39:13.31
101uy:2011/06/14(火) 13:47:07.69
gem install tk-win
102デフォルトの名無しさん:2011/06/14(火) 13:57:05.49
>>101
うああああああああありがとうございます
ウィンドウが出るようになりましたああああああああああああ
103デフォルトの名無しさん:2011/06/14(火) 14:06:55.33
gets.to_fでルートの値を入力したいんですが計算式は入力できませんか?
104デフォルトの名無しさん:2011/06/14(火) 14:18:32.84
>>103
…素直にコマンドラインの計算プログラム使ったほうが

IO.gets が返すものはただの文字列だ
その文字列をどう処理するかは何も決まってない
ルートを入力したいなら、入力された文字列がそのようであるときに、そのようになるようにすればいい
105デフォルトの名無しさん:2011/06/14(火) 14:21:59.79
> ruby -e "puts eval gets"
Math.sqrt(3)
1.73205080756888
106デフォルトの名無しさん:2011/06/14(火) 14:26:10.53
instance_eval していいかどうかでかなり変わるな
計算記号のパースとかあんまりやりたくないわん

instance_eval していいなら、Ruby で使える文字列をそのまま入力すればいい
なんでもできてしまうのでセキュリティ的に大問題だが
107デフォルトの名無しさん:2011/06/14(火) 14:33:20.29
>>106
eval教えたらCGI入力に対して使ったアホの子がいてだな…
108uy:2011/06/14(火) 16:03:34.49
include Math

def repl s
  s.sub!($1 , (repl $1).to_s) if s=~/\(.*?(\(.*)\)/
  s =~ /\((.*?)\s(.*)\)/
  case $1
  when "+" , "-" , "*" , "/" , "**"
    return $2.split.map do |n| n.to_f end.inject $1.to_sym
  when "sqrt" , "p" 
    return $2.split.map do |n| n.to_f end.inject 0,$1.to_sym
  end
end
p repl "(sqrt 2)"
p repl "(+ 2 2)"
p repl "(- 5 2 2)"
p repl "(* 4 4 4)"
p repl "(/ 10 2)"
p repl "(** 3 3 3)"
repl "(p (+ 4 8 9 (+ 8 3 (** 5 5 (sqrt 12)))))"

#p repl gets


109デフォルトの名無しさん:2011/06/14(火) 16:51:34.11
Rubyは数式処理ライブラリすらないのかよ
ホビロンすぎる
110デフォルトの名無しさん:2011/06/14(火) 16:54:40.47
いっぱいあるよ
111デフォルトの名無しさん:2011/06/14(火) 17:08:32.04
rubyはテキスト処理向きだから数式処理が不得意なのはしょうがない。
言語解析ライブラリは充実してるけどね。
112デフォルトの名無しさん:2011/06/14(火) 17:11:38.74
言語解析ライブラリなんてそんなあるのか?
113デフォルトの名無しさん:2011/06/14(火) 17:34:27.91
言語解析ってmecabみたいなやつ?
114デフォルトの名無しさん:2011/06/14(火) 18:02:11.52
たぶんraccとかtreetopとかのことだと思う。
mecabみたいなのは自然言語処理というのではないだろうか。
115デフォルトの名無しさん:2011/06/14(火) 18:05:39.94
自然言語処理の一分野だけど、形態素解析、かな。

raccやtreetopみたいなのは自然言語処理的には統語解析と言うが、普通は
構文解析と言うかねぇ。

結論としては >>111 は半可通。
116デフォルトの名無しさん:2011/06/15(水) 13:33:41.23
[LF]は改行を意味します
[\t]はタブを意味します
[\s]は半角スペースを意味します

-------------
a[LF]
[LF]
[\s][\s][\s][\s][\s][\s][\s][\s][\s][\s][\s][\s][\s][\s]
[[\s](100.200)
-------------

------------
a[\t][\s][\s][\s][\s](100,200)
------------
のどちらの場合でも100,200の部分を取得したいのですが
str.scan(/a.*?\(([0-9,]*?)\)/)では後者のほうしか取れません
改行とタブとスペースが混じっていても取得する方法をご教示お願いします
117デフォルトの名無しさん:2011/06/15(水) 13:36:11.39
自己解決しました
マルチラインを設定したら取れました
118デフォルトの名無しさん:2011/06/15(水) 22:07:26.39
最近いろんなプログラミング言語でyieldを見かけるけど言いだしっぺの言語はなんなん?
119デフォルトの名無しさん:2011/06/15(水) 22:10:19.36
javascript
120デフォルトの名無しさん:2011/06/15(水) 22:12:52.40
CLUだったかな。
121デフォルトの名無しさん:2011/06/15(水) 22:15:03.07
javascript? 後発のイメージがあったけど
122デフォルトの名無しさん:2011/06/15(水) 22:15:15.34
ピッケル本にCLUでyieldが使われてて云々って注がついてたなあ
言い出しっぺかは知らない
123デフォルトの名無しさん:2011/06/15(水) 22:15:54.48
124デフォルトの名無しさん:2011/06/15(水) 22:17:56.94
CLUが1974年だから、それより前にあるかどうかだな。
125デフォルトの名無しさん:2011/06/15(水) 22:57:10.75
なるほど。ありがとさん
126デフォルトの名無しさん:2011/06/16(木) 11:16:52.66
正規表現を表すクラスを作ってます。
'*' は Repeat, '|' は Choice でいいと思いますが、'?' は何と名前を付けたらいいでしょうか。
127デフォルトの名無しさん:2011/06/16(木) 11:18:38.89
Prediction
音声を聞く
128デフォルトの名無しさん:2011/06/16(木) 11:38:29.96
>>127
えっとそれは>>126への回答? なぜ「予言」?
129デフォルトの名無しさん:2011/06/16(木) 11:41:30.28
match
130デフォルトの名無しさん:2011/06/16(木) 11:43:59.48
そんなん自分で考えろって感じだわ。
131デフォルトの名無しさん:2011/06/16(木) 11:45:58.89
>>126
question
132デフォルトの名無しさん:2011/06/16(木) 11:46:37.32
*がRepeatなら?, +もRepeatだろ。さらになんか修飾したら。
133デフォルトの名無しさん:2011/06/16(木) 12:00:33.07
>>126
>'*' は Repeat, '|' は Choice でいいと思いますが
よくない
* は CleeneStar
| は Alternatives
134デフォルトの名無しさん:2011/06/16(木) 12:05:26.17
正規表現のBNFさがせば適当に命名されてるのが見つかるんじゃね
135デフォルトの名無しさん:2011/06/16(木) 12:11:19.61
*をクリーネスター、+をクリーネクロスと呼んでしまうと?を呼ぶ方法がなくなってしまうという罠
136デフォルトの名無しさん:2011/06/16(木) 12:24:36.64
>>134
ttp://www.chimaira.org/docs/Regularity.htm
にありました。
, concat
| choice
? option
* repeat
+ positiveRepeat
だそうです。optionか、なるほど。
ありがとです。
137デフォルトの名無しさん:2011/06/16(木) 19:15:37.46
windowsでirbを起動するとreadline.dllが無いと怒られます。
そこでreadline.dllを見つけてインストールしましたが
今度はヒストリが効かなくなりました。
readline.dllがなくてもメッセージを出なくする方法か
readline.dllありでヒストリを有効化する方法を教えてください。
138デフォルトの名無しさん:2011/06/16(木) 20:17:46.51
まずは ruby -v を
139デフォルトの名無しさん:2011/06/16(木) 20:28:31.72
失敬
ruby 1.9.2p136 (2010-12-25 revision 30365) [i386-mswin32]
140デフォルトの名無しさん:2011/06/16(木) 21:09:57.91
どうやってインストールしたんだよ
141デフォルトの名無しさん:2011/06/16(木) 22:42:19.05
バイナリをダウンロードしてbinフォルダへ移動
142uy ◆yyC0rYWEq2 :2011/06/16(木) 22:53:16.02
innsutoorusinaositokayattawake?
http://rubyinstaller.org/downloads/
mazusoresuskosiversionhuruisi
http://rubyinstaller.org/downloads/
sonnnakotoitterumaeniinsutoorusinaosebaiidaro
http://rubyinstaller.org/downloads/
hutuunitadamaisukurikkusiteikudakedaronandesoresuradekinainnndayoimigawakaranai
http://rubyinstaller.org/downloads/
gomitoiujigennwokoeteirukigasuruittaidouiukaitouwokitaisiteresuwositeiruno
http://rubyinstaller.org/downloads/
bokuharubynoinsutoorusaedekimasenndesuttekasonnnakotohoukokusinikonakutemoiikara
http://rubyinstaller.org/downloads/
mousenoclickwositeikudakeicanflay
143デフォルトの名無しさん:2011/06/16(木) 22:57:51.23
エスペラントでおk
144デフォルトの名無しさん:2011/06/16(木) 23:22:20.72
ローマ字読まなくても意図は伝わってくるな
再インスコしろと
145デフォルトの名無しさん:2011/06/17(金) 00:17:21.98
最近質問少ないから勢い下がっちゃった
146デフォルトの名無しさん:2011/06/17(金) 01:15:47.07
インストールはできています。
147デフォルトの名無しさん:2011/06/17(金) 01:44:51.67
できてねえって

いや、まあ、正確には、インストールする前かインストールしたあとに環境変数かなにかを弄ったのだろう
インストールのシーケンス自体は成功してるのだと思う
mswin32でreadlineに関する文句が出ることはな


ああ、えーと、その、なんだ、
ttp://www.garbagecollect.jp/ruby/mswin32/en/download/release.html
Ruby公式から辿れるここからzipファイルをダウンロードした場合は、あらゆるdllを自前で用意しなければならない

ActiveScriptRuby使え
ttp://www.artonx.org/data/asr/
このmsiには全部入ってる
前スレの前スレまでは公式サイトのリンクを使わせないようにテンプレでASRへの誘導があったんだけど、気違いのアホが消したんだ
148けいたいうゆ:2011/06/17(金) 02:40:48.90
いまさらいうけど
あのすれたてしたuyは偽だから
別物だから
誤解なきよう
149デフォルトの名無しさん:2011/06/17(金) 02:47:57.00
「うゆ」っていう文字列を「ばか」という文字列に置換すると特徴が把握できるよ
150デフォルトの名無しさん:2011/06/17(金) 02:56:36.83
>>148
心配しなくてもuyの時点で同類としか見てないから誤解しても問題ないよ
151デフォルトの名無しさん:2011/06/17(金) 03:07:35.78
うまくいきました。ありがとう。
リンク先の
> このパッケージではreadline.soの問題(漢字入力不可、カーソルキーが利用できない)を修正するパッチ([ruby-dev:42232])を当てています。
が原因かもしれません。(Ctrl-PやCtrl-Nではヒストリは使えてたので)
152デフォルトの名無しさん:2011/06/17(金) 06:14:00.70
毎回ウィンドウズの人がまともに動かすだけで苦労してるのを見ると、教祖と同じデビアンにしとけよと思う。
単にルビィは馬鹿には無理だけなのかもしれないけど。
153デフォルトの名無しさん:2011/06/17(金) 07:47:13.35
Rubyを使うためだけにDebianにしたら本当に馬鹿だと思う
154デフォルトの名無しさん:2011/06/17(金) 07:54:22.26
今はVMがかなり手軽に使えるからね。
手間隙かけてCygwin環境作るよりはVMでDebianをポンと入れて学習するのでもいいと思う。
155デフォルトの名無しさん:2011/06/17(金) 08:02:59.50
ウィンドウズで詰まって投げ出すくらいなら、デビアンでちゃんと使えたほうがいいと思われ。

デビアンでもapt-getとか簡単なコマンドあるでしょ。
教祖がちゃんと動作確認しているもも大きいし。
156デフォルトの名無しさん:2011/06/17(金) 08:06:38.55
まあLinux使ってたって詰まるところでは詰まるのだから
わざわざ新しくLinux入れなくても
Windows使いはWindows版、Linux使いはLinux版でいいと思う
157デフォルトの名無しさん:2011/06/17(金) 08:11:26.42
普通は自分の環境を便利にするために言語なりツールなりを用意するわけで
道具のために環境用意するのは本末転倒だわな
学校か何かでRubyの学習が強制されてるとかならともかく
158デフォルトの名無しさん:2011/06/17(金) 08:16:44.85
RubyInstallerなりASRなりJRubyなりなら問題ないわけだしな

debianでもパッケージかRVMで入れるのが普通で
自力でソースからビルドなんてまずしないわけで
単に誘導の問題なんだろうな
159デフォルトの名無しさん:2011/06/17(金) 08:56:09.39
WindowsでRuby環境作るのに手間取る人がデビアン使えるとはとても思えない。
160デフォルトの名無しさん:2011/06/17(金) 09:02:58.33
161デフォルトの名無しさん:2011/06/17(金) 09:22:21.43
ということを質問しないとわからない人がそれが問題になるようなプログラムを作るべきではない
162デフォルトの名無しさん:2011/06/17(金) 09:33:05.99
それは回答になってないね
163デフォルトの名無しさん:2011/06/17(金) 10:23:21.89
>>160
それを読んで意味がわかるならテストしてみたらどうだろう。
それを自力でテストできない人が読んで意味がわかるとは……。
164デフォルトの名無しさん:2011/06/17(金) 11:04:47.22
分からないなら黙ってれば
165デフォルトの名無しさん:2011/06/17(金) 11:14:43.65
そう思うならバカな質問はしないことだ。
166デフォルトの名無しさん:2011/06/17(金) 11:17:03.83
>>160
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
167デフォルトの名無しさん:2011/06/17(金) 11:41:45.03
サロゲートペアにOS関係ないだろう。。。。
168デフォルトの名無しさん:2011/06/17(金) 11:47:43.02
OSの部分だけ取り出すとはマジキチか
169デフォルトの名無しさん:2011/06/17(金) 11:47:58.00
少なくとも >>160 から「サロゲートペアについて聞きたい」ということを読み取るのは大変困難だと思うが。
170デフォルトの名無しさん:2011/06/17(金) 11:54:15.75
バカが質問してバカが答えるスレ
171デフォルトの名無しさん:2011/06/17(金) 11:58:11.25
>>167
・最終的にやりたいこと
172デフォルトの名無しさん:2011/06/17(金) 12:25:52.01
>>160 に上げられている記事を160自身が理解しているのであれば
Rubyでの実現方法は別として、
何をテストすればよいか理解でき、何を聞けばよいかも理解できるはず。

それを出してこないということは、160自身が何を質問してよいのか分かっていないことを示唆する。

記事への感想ならともかく、
160自身もわかっていない問に答えることは誰にも出来ない。


173デフォルトの名無しさん:2011/06/17(金) 12:41:06.13
あるいは、Ruby1.9.2にはこういうことに気を配らなくてもいい素敵機能はあったりしませんか?
ということかなぁ。

irbの文字列リテラルに \x?? で試してみると特に例外にもならずUTF-8なStringができるから、
ない、というのが答えになるけど。
174デフォルトの名無しさん:2011/06/17(金) 12:50:17.69
自分だったら、件の記事を読んで、
1.9系のエンコードがUTF-8なStringをバイト列をもとに生成するようなシーンで、
バイト列が不正でかつ記事にあるようなパターンのときにどうなるかきになるし、
irbを適当に叩いて検証するんだろうけど、
それが160の問いとイコールかどうかなんてわからないからなあ。
175デフォルトの名無しさん:2011/06/17(金) 14:17:47.57
>>173
一度UTF-16なんかに変換して不正な文字を置き換えるしかないかな。

"\xf0\x80\x80\xbc".encode("UTF-16LE",:invalid=>:replace,:replace=>'?').encode("UTF-8")
176uy ◆yyC0rYWEq2 :2011/06/17(金) 15:39:31.57
lambdaの再帰って何かいい方法ないの? なんなの?

p lambda {
  fact = lambda { |n|
    if n == 0
      1
    else
      n * fact.call(n - 1)
    end
  }
}.call.call 4

p Class.new {
  def self.lambda n
    if n == 0
      1
    else
      n * self.lambda(n - 1)
    end
  end
}.lambda 5

177デフォルトの名無しさん:2011/06/17(金) 16:02:43.52
Yコンビネータでぐぐる。
178uy ◆yyC0rYWEq2 :2011/06/17(金) 16:21:02.35
あれは見た目が最悪
179デフォルトの名無しさん:2011/06/17(金) 16:26:51.47
YコンビネータやUコンビネータが嫌ならRubyの無名関数で再帰は使わないことにしましょう。
180uy ◆yyC0rYWEq2 :2011/06/17(金) 18:10:52.94
Yなんちゃらって結局変数を引数の場所に閉じ込めてるだけだからね

def saik n
  yield( n , lambda do | n , f |
    yield n , f
  end )
end


n = saik 5 do | n , f |
  if n == 0
    1
  else
    n * f.call( n - 1 , f)
  end
end
p n

こういう方法もあった
181uy ◆yyC0rYWEq2 :2011/06/17(金) 19:19:22.96
def a *h
  if iterator?
    @aaa = lambda do |*h| yield *h end
  end
  @aaa.call *h
end
n=a 4 do | n |
  if n == 0
    1
  else
    n * a(n - 1)
  end
end
p n


完成した、お疲れ様でした
182デフォルトの名無しさん:2011/06/17(金) 23:41:45.15
正しいディレクトリとファイルを指定しているのにもかかわらず、
No such file or directory -- (ファイル名)(LoadError)と表示されるのはなぜでしょうか。
osはvista、バージョンは1.9.2です。
183デフォルトの名無しさん:2011/06/17(金) 23:45:20.55
>>182
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
184デフォルトの名無しさん:2011/06/17(金) 23:46:31.49
>>182
ライブラリのとこからじゃなくてカレントディレクトリから読もうとしてるなら
パスの頭に ./
185デフォルトの名無しさん:2011/06/18(土) 00:34:22.16
>>180-181
車輪の再発明お疲れ様。
186デフォルトの名無しさん:2011/06/18(土) 00:47:59.86
正しいと思い込んでるだけかバグかだが前者の公算が高い。
187uy:2011/06/18(土) 00:54:54.04
$0
で得られるファイル名のロードを試せ
それでもエラーでるならOSかRubyがおかしい

>>185
え?
188デフォルトの名無しさん:2011/06/18(土) 01:48:43.61
>>182エラーは略さず全部書け
かなり頻出の質問でrequire_relativeでググるか>>184か解決法は他にもいろいろある
189デフォルトの名無しさん:2011/06/18(土) 09:33:24.51
不動点コンビネータなんて既にいくつも実装が考案されてるのに
190デフォルトの名無しさん:2011/06/18(土) 09:36:05.41
「無名関数で再帰したい」という疑問が
メソッドにして名前をつける(えっ)
インスタンス変数に保存(定義してる文脈ではグローバル変数と同義)(えっ、えっ)
っていうので解決されてると思い込めるのがすごいね!
191デフォルトの名無しさん:2011/06/18(土) 10:27:08.41
「えーマジメソッド名!?」
「キモーイ」
「メソッド名が許されるのは小学生までだよねー」

fact = lambda{|n|
 lambda{ |f|
  lambda{|proc| f[lambda{|args| proc[proc][args] }]}[
   lambda{|proc| f[lambda{|args| proc[proc][args] }]}
  ]}[lambda{|f| lambda{|x| x == 1 ? 1 : x * f[x-1]}}][n]}

p fact[5]
192デフォルトの名無しさん:2011/06/18(土) 11:58:24.24
rubyでプログラム書くときみなさんはどんなIDEを使っていますか?
やはりeclipseがおおいのでしょうか?
193デフォルトの名無しさん:2011/06/18(土) 12:03:25.50
IDEを使っていない
テキストエディタでおk
194デフォルトの名無しさん:2011/06/18(土) 12:14:09.25
スクリプトでIDE使ったら負け
195デフォルトの名無しさん:2011/06/18(土) 12:31:38.71
>>194
どうしてスクリプトでIDEを使ったら負けなんでしょうか?
196デフォルトの名無しさん:2011/06/18(土) 12:49:40.87
必要ないから
197デフォルトの名無しさん:2011/06/18(土) 12:55:39.65
自分の価値観を理由に据えるやつは三流以下
198uy:2011/06/18(土) 12:59:40.31
>>190
僻みか
つうか処理系側で実装されるまで一時的に使うだけのものだぞ
多重再帰まで対応させる気はないし

>>191
それはもう2レス目ででてた
今更それをかかれてもな

一般人はlambdaの再帰なんて不要だもんな
はいはい
どうせ俺くらいだよ多用してんのは
199デフォルトの名無しさん:2011/06/18(土) 13:00:39.64
IDEを使う理由を教えてください
200デフォルトの名無しさん:2011/06/18(土) 13:04:33.81
このネタはいつも脳が老化してema糞以外を受け付けなくなった老害が暴れまくるから
まともな結論は得られません。
201デフォルトの名無しさん:2011/06/18(土) 13:05:47.45
emacsも使わないけどIDEとかどうでもいい。
202デフォルトの名無しさん:2011/06/18(土) 13:09:14.05
Rubyに関してはそもそもほとんど助けてくれないからな
機能の差し引きでマイナスだと考えているひとのほうが多い

IDEを使えば自動的に便利になるというのは間違い
IDE側が意識的にサポートしているから便利になる
203デフォルトの名無しさん:2011/06/18(土) 13:10:00.66
遥か昔に解決されたものを劣化で再発明して喜ぶ人がいるスレはここですか
204デフォルトの名無しさん:2011/06/18(土) 13:11:05.01
IDEをバカにされて悔しいの?そんなに?
205デフォルトの名無しさん:2011/06/18(土) 13:12:50.66
>>204
>>203はきっと見えない人宛のものだ
206192:2011/06/18(土) 13:13:24.05
ありがとうございます。
楽しいruby3を見ながら勉強しているのですが、IDEは特にいらないようですね。
秀丸などのテキストエディタ使って、コマンドプロプントで実行というスタイルにします。
207デフォルトの名無しさん:2011/06/18(土) 13:25:39.73
好きなようにやりゃいいんだよ
208uy:2011/06/18(土) 13:27:02.91
>>203
明らかに僻みだよねwwどうしちゃったのww
え?、俺はそれを使っていくよ
使いやすい形にするために作ったんだからさ
Yナンチャラの理論を数時間で突破してみせてみただけの事で、
uy的にはこの程度、なんでもないんですけど



Ruby in Steelで良い
なんと.NETアプリケーションが不完全ながらも作成可能
インストールの難易度はレベル4くらい
209デフォルトの名無しさん:2011/06/18(土) 13:51:50.70
数時間で突破(笑)

トップレベルのインスタンス変数やらメソッド名に束縛しちゃうのが使いやすい形ですかそうですかー。
210デフォルトの名無しさん:2011/06/18(土) 13:55:06.12
RubyでIDE使う人と一緒に仕事はしたくない
211uy:2011/06/18(土) 13:58:39.49
天才プログラマのuyさんははやくRuby普及の決め手になるキラーアプリを開発してくれないかなー。

まともなアプリケーションも作らずにごちゃごちゃ遊んでるだけで「俺はすごいぞ」とか言われてもー。
212uy:2011/06/18(土) 14:04:18.95
「何も見ないで自力で作ったぞ!」なんてはりきられても「その証拠は?」って感じだし、
仮にそうでも汎用性のない劣化車輪の再発明だし、
なによりまともに使えるプログラムのひとつも書いてない奴にどう僻めばいいんだ。
213uy ◆yyC0rYWEq2 :2011/06/18(土) 14:05:35.27
>>209
>トップレベルのインスタンス変数
その件に関しても突破可能


>>211
たとえば何?
214uy:2011/06/18(土) 14:11:51.36
優秀なプログラマさんなら有用な成果物のひとつやふたつ提示できるでしょ、ほらほら。

一生車輪を劣化状態で再発明して「昔の人が長い時間をかけて作ったものを僕は数時間で突破したぞ!」って喜んでなよ。
215uy ◆yyC0rYWEq2 :2011/06/18(土) 14:17:55.59
1個だけ教えておくと
lambdaっていうのはオブジェクトの代わりになるんだよ
>>191 のこれは、 本来fっていう変数が定義されるべきものを、
変数ではなくlambdaオブジェクトにしただけで
実はそれ本当にただのスパゲッティソースなの
「lambdaがオブジェクトの代わりになる」っていう事を知らない子が作ったものじゃないかと思ってしまう

こういえばわかるかな、
ソース書いてる途中にちょっとlambdaの再帰がほしくなったときに、いちいち>>191これをかくというのか?
数学の世界の学術的には、そのlambdaで何でもできますよっていう証明にはなってるんだけど、
実際にプログラミングするときに、それを表面上にそれを持ってくるものではない
結局アセンブラレベルで見たら、lambdaだろうと、インスタンス変数だろうと同じだから、案外機械語では似たような事になってるかもよ

>>214
最近http://hibari.2ch.net/test/read.cgi/tech/1306333092/267
これ作りました、30分で。
216uy ◆yyC0rYWEq2 :2011/06/18(土) 15:34:29.66
つうかRubyてもう十分普及してるんじゃないの
VisualuRuby
IronRuby
各種ゲームLib
rails
他に何があればキラーアプリになるんだ

一応、OSのGUI関連書く前にRubyでアルゴリズム成熟させてからCで書き直そうと思って
Rubyで見た目OSっぽいのは作っているからそれはそのうち公開してやるよ
それに俺はRuby信者なのではなく、現状最もマシなのがRubyだからこれ使ってるだけで
これより良い言語でてきたらすぐに裏切るよ

ぼくは英語読めなくても英語サイトから情報拾ってくる事は出来るけれど
日本語のほうが読みやすいのは当たり前だから応援はしている
217デフォルトの名無しさん:2011/06/18(土) 17:37:49.19
「30分で」という部分にゃ価値もなければ信憑性もないし、
こんなんメカナイズ使ってりゃ誰でもすぐに書けるね。
もっとまともなプログラムないの?
218デフォルトの名無しさん:2011/06/18(土) 17:45:47.98
馴れ合いはほかでやっておくんなまし
219デフォルトの名無しさん:2011/06/18(土) 17:51:44.20
まだ表示してる人いるんだなあ。
220デフォルトの名無しさん:2011/06/18(土) 18:03:20.96
車輪の再発明と馬鹿にするのは初心者が通る道
221デフォルトの名無しさん:2011/06/18(土) 18:15:18.66
IE,Firefox,ChromeのどれかのCookieをRubyで使うにはどうしたらよいでしょうか?
222デフォルトの名無しさん:2011/06/18(土) 18:50:10.06
IEのクッキーなんかファイルに書き出されてるんだから勝手に使えばいいじゃん
223デフォルトの名無しさん:2011/06/18(土) 18:57:27.27
どうやってサーバに送信したらいいですか?
224デフォルトの名無しさん:2011/06/18(土) 20:31:21.62
Rubyと相性の良いLinuxって何ですか?
225デフォルトの名無しさん:2011/06/18(土) 20:33:31.00
Debian
226デフォルトの名無しさん:2011/06/18(土) 20:38:06.45
debianか〜CentOSかVineってダメなの?
227デフォルトの名無しさん:2011/06/18(土) 20:42:03.47
そもそも相性なんて気にするほどのものは無い
Windowsを除いては
228デフォルトの名無しさん:2011/06/18(土) 21:08:20.28
32ビットインテルのDebianのみが"Rubyで定義されている意味で"サポート環境である、だけ。
229uy ◆yyC0rYWEq2 :2011/06/18(土) 21:12:24.17
>>217
そうではなくメカナイズをしらないところからググって
メカナイズインストールして、仕様を調べて、それを全部含めた時間が30分。、で作りました
理由、理由はPerlスレに迷える子羊がいたからです

まず俺のソース読みたいならツリー構造と再帰とマクロに慣れてる事と、
クラスを使わずにlambdaのみでプログラム設計した事があるってのが最低条件
関数を返す関数を返す関数とかが普通に出てくるけど、よめんのそれ
クラスを使わないプログラム設計って言われて君は理解できるのk

読めないを理由に「たいしたものじゃない」とか勝手に決め付けられて終わるのが目に見えてるから晒しません^^
230デフォルトの名無しさん:2011/06/18(土) 21:17:52.15
正直すごいと思うんだが
関数を返す関数を返す関数とかが出てくるプログラムの設計書を書くとしたら
分かりやすくかけるもんなの?
それとも設計書じゃない何かでプログラムの概要などなどを説明するの?
231uy:2011/06/18(土) 21:29:11.48
コードが仕様書なんだよ(キリッ
232デフォルトの名無しさん:2011/06/19(日) 01:21:25.17
lambdaによるプログラム設計(笑)
とか言うなら>>180-181なんてお粗末なプログラムを書くのはやめましょう。
233デフォルトの名無しさん:2011/06/19(日) 01:28:15.10
お遊びじゃないまともに使えるプログラム書いてるなら
ソースで複雑怪奇なことしててもプログラムの機能自体で評価されるじゃないか。

所詮ソースコードで「変わったことやってんなー」ってぐらいのお遊びコードしか書いたことなくて、
まともに開発なんかやったことないんだろ。
234デフォルトの名無しさん:2011/06/19(日) 02:02:40.16
まともに開発するならRuby使わないだろw
235uy ◆yyC0rYWEq2 :2011/06/19(日) 04:18:57.68
OS製作前準備.rb は着々と形になっていってるけど、みるー?みたいー?
>>230-n
どうでもいいな・・・
これを鬱というのか賢者モードというのか、どちらなのかはわからないけど、心が静かなんだ
土砂降りの雨に混じって、叫び声が聞こえる
梅雨の雨に、あの日の雨の名残を探しにいってくる
236uy ◆yyC0rYWEq2 :2011/06/19(日) 05:04:08.31
所詮2chの名無しなんて
俺が何を作ろうと、煽り続けるんだろう
相手してるとつかれるんよ
「OS製作前準備.rb」にかかれてるソースの断片すらどうせ読めない癖にな、何個の再帰がある事か
再帰で書きまくるソースコードを「一風変わったもの」というカテゴリに納める事しかできないから
いつまでたってもそこにいるんだよ
普通にかくよりも再帰にすることでソースコードが格段に縮まる事くらいの知識は、あるだろう 俺はそういう場所にいるレベル

もう、レベルは上がるところまで上がっているので、俺には何を言っても無駄
何かを作れって? は、? バカか
お前らに使われるアプリケーション作る為に身に着けた技術じゃねーよ死ねバカ
237デフォルトの名無しさん:2011/06/19(日) 06:05:36.35
>>234
あまり関係ない
なんらかのプロダクションコードを書いたことがあるかどうかは、言語問わず、普段のコードに反映される
ちょうど、社会人と学生の間に言動の差があるのに近い
Cでプロダクションの洗礼受けた人は、Rubyで書いてもPHPで書いてもHaskellで書いてもちょっと違う
238デフォルトの名無しさん:2011/06/19(日) 07:59:49.56
>>192
IDEの中で今主流っぽいのはたぶんNetBeans
使いやすさと「元々は公式にサポートされてた」という事情から、けっこうメジャー
Eclipseにも色々プラグインはあるらしいけどよく知らない
あとはRDEもIDEの1種として数えるなら、そこそこ人気(色々不安定だけど)

でもまぁ、IDEが必要かどうかは個人と環境によって違う
俺の場合だとテキストエディタとIDE併用してたりするし
コアなemacs使いなら「IDEなんていらない」って人も多いだろうし

>>202
> Rubyに関してはそもそもほとんど助けてくれないからな
入力補完だけでもかなり大きな助けになるんじゃね?
gemや自作クラスからの入力補完便利だよ
239デフォルトの名無しさん:2011/06/19(日) 09:14:45.32
>>235
ソースの名前出してるけど、結局コードが仕様書ってことなの?
rdocとかriで整備してるってこと?

で、他人が使うアプリじゃないってことは自分用アプリってこと?
まあそれなら設計書の類は要らないか
240デフォルトの名無しさん:2011/06/19(日) 10:39:13.64
[1,2,3][3]が例外吐くようにするモードってないんですか
241デフォルトの名無しさん:2011/06/19(日) 10:56:05.76
>>240

irb> class Array; alias _brak []; def [](i); raise ArgumentError.new('Out of Range') if size < i+1; _brak(i); end; end
irb> [1,2,3][3]
ArgumentError: Out of Range
from (irb):2:in `[]'
from (irb):3
irb> [1,2,3][2]
=> 3

ただし、non_nil_array[x] が nil を返すことで x が配列サイズ範囲外であるという検知をしているライブラリがあればバグる
策としては下の下で、やった瞬間全世界から指さされるレベル

ユーザー側で配列の大きさを事前にチェックするのが普通

if arr.size < x + 1 then
raise "#{x} なんて大きすぎて入らないよぉ"
else
arr[x]
end
242デフォルトの名無しさん:2011/06/19(日) 12:11:02.76
>>240
fetch使えばええやん
243デフォルトの名無しさん:2011/06/19(日) 17:59:35.24
fetchを使っても[1,2,3][3]が例外吐くようにはなりません。
244デフォルトの名無しさん:2011/06/19(日) 18:07:40.45
うむ

>>240ベースで
class Array; undef []; def [](x) fetch(x) end end

こんな感じ?
245デフォルトの名無しさん:2011/06/19(日) 19:00:24.64
>>238
Rubyをワンライナー的な用途にしか
使わない人達もまだ少し残ってるからね。
そういう人達の狭い視野から見たらIDEどころかエディタすらいらないんだろう。
246デフォルトの名無しさん:2011/06/19(日) 19:13:30.76
>>243
#[]を使わなきゃいいじゃん
247デフォルトの名無しさん:2011/06/19(日) 21:25:52.15
どんな局面で[1,2,3][3]が例外はいて欲しいのか分からないとなんとも言いようがないね
248デフォルトの名無しさん:2011/06/19(日) 21:32:56.02
添字の範囲外へのアクセスなんて異常なことだから
例外吐くのはそれなりに合理的だと思われ

>>243
1.9だか1.9.2なら
>> [1,2,3].fetch(10)
IndexError: index 10 outside of array bounds: -3...3
249デフォルトの名無しさん:2011/06/19(日) 23:09:17.79
それfetch(10)だからはいてるんであって[3]は吐かないよ
250デフォルトの名無しさん:2011/06/20(月) 00:41:08.47
だから、吐いて欲しい用途のためにfetchがあるんだってばさ。
251デフォルトの名無しさん:2011/06/20(月) 01:09:01.59
以下ループ

実際問題としては、Array#[] で例外が出るとみんな困るので、運用が間違っとるとしか言えない
自前で事前に配列のサイズチェックしろとしか
っていうか、どうせ、例外が出たら処理変更するんだろ
まさか例外をトップレベルの外にエラーとしてぶん投げるわけじゃないよね?

まあ確かに

begin
process(arg)
rescue BadArgumentProcessError
fail_process
end



if check(arg) then
process(arg)
else
fail_process
end

は動作が違って、正常系がほとんどの場合は毎度の if check(arg) の処理のぶん動作が遅く…
ならないことが多いと思う、check の重さにもよるけど
たとえば、細かいファイルすべてに対して事前に File.exist? やると File.open の例外キャッチよりは遅い
252デフォルトの名無しさん:2011/06/20(月) 01:10:57.10
数値がどんな計算しても0以下にならないとか10以上にならないとか
そういうものを設定できる、メソッドかライブラリはないでしょうか?
こんな感じ

n = 0
n.min_set = 0
n.max_set = 10

p n -= 5 # => 0
20.times do
  n += 1
end
p n # => 10
253デフォルトの名無しさん:2011/06/20(月) 01:22:05.51
>>252
最終的に min か max つかえ
それと、Ruby の変数は箱じゃなくて、個々のオブジェクトに貼られたラベルに過ぎず、
さらに、若干悪いことに、数値は変更不可能なオブジェクトになってる

n = 2
としたあとに
n = n + 1
するというのは、 2 に 1 を足した結果のオブジェクトに n という変数名を新たにつけるという行為でしかない
254デフォルトの名無しさん:2011/06/20(月) 01:40:12.40
>>252
こんなのなら提案されている
http://redmine.ruby-lang.org/issues/4574
255uy ◆yyC0rYWEq2 :2011/06/20(月) 01:55:52.76

class A
  def initialize n , min , max
    @n   = n
    @min = min
    @max = max
  end
  def set s = @n
    return @n = @max if s > @max
    return @n = @min if s < @min
    @n = s
  end

end
n = A.new 0 , 2 , 7

p n.set 88
p n.set -6

256デフォルトの名無しさん:2011/06/20(月) 02:16:10.56
>>255優秀なプログラマとは思えないコードだな
まず関数名setはねーだろ
んで足し算はどうすんだ?n.set(5+10) とかやんのか?@nいらんだろアホか
そらならユーティリティクラスにするかトップレベルに関数置けよ
257uy ◆yyC0rYWEq2 :2011/06/20(月) 02:30:16.08
>>256















>>256
>@nいらんだろアホか
はあああぁっぁあああああぁぁぁぁあぁ?wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
258uy ◆yyC0rYWEq2 :2011/06/20(月) 02:35:04.57
ちょっと本気だしてかいてくるよまってろ
259デフォルトの名無しさん:2011/06/20(月) 02:36:03.32
確かに@nの意味がよく分からん
#+などの定義を省略しただけなんだろうけど

class Utility
def self.clamp(min, n, max)
raise ArgumentError.new("homuhomu") if min>max

return min if n<=min
return max if n>=max
n
end
end

(1..10).each do |i|
puts "#{i}: #{Utility.clamp(3, i, 6)}"
end
260uy ◆yyC0rYWEq2 :2011/06/20(月) 02:49:15.45
ダメだ、勘違いだったRubyにgotoないや
261uy ◆yyC0rYWEq2 :2011/06/20(月) 03:07:13.37
        
module A
  def self.extended mod
    f = self.test mod[:n] || 0 , mod[:max] , mod[:min]
    mod.define_singleton_method :set do | *s |
      f.call *s
    end
  end
  
  def self.test n , max , min
    lambda do | s = n |
      return n = max if s > max
      return n = min if s < min
      n = s
    end 
  end
end

a = ({ :n => 0 , :max => 7 , :min => 2 })
a.extend A

p a.set 
p a.set 8
p a.set 
p a.set 1
p a.set 


妥協、
= での代入時に値ごまかすのはRubyだと無理かもな
262252:2011/06/20(月) 03:37:37.98
沢山のレスありがとうございます
標準ではないのですね・・・
その場にifかいちゃったほうがわかりやすいかもしれませんね
263uy ◆yyC0rYWEq2 :2011/06/20(月) 05:59:25.82
require "ostruct"
module A
  def self.extended mod
    f = self.test mod[:n] || 0 , mod[:max] , mod[:min]
    mod.define_singleton_method :set  do | *s |
      f.func *s
    end
    mod.define_singleton_method :set_ do
      f
    end
  end
  def self.test n , max , min
    hs       = Hash.new
    hs[:n]   = n
    hs[:max] = max
    hs[:min] = min
    a = OpenStruct.new hs
    a.define_singleton_method :func do | s = a.n |
      return a.n = a.max if s > a.max
      return a.n = a.min if s < a.min
      a.n = s
    end 
    return a
  end
end
a = ({ :n => 0 , :max => 7 , :min => 2 }).extend A
p a.set 99
a.set_.max = 12
p a.set 99
寝る前に投稿:ちなみに漏れのソースコード(ノードプログラミング)はこんな感じに、関数内のオブジェクトの全てに、外部からアクセスさせる手段を用意してる
264デフォルトの名無しさん:2011/06/20(月) 06:11:00.20
お前何でこんな時間まで起きてるんだよ
職場がフレックスタイム制なのか?
265デフォルトの名無しさん:2011/06/20(月) 06:39:24.12
1時間おきに5分ぐらい寝てるんじゃないかと想像
266デフォルトの名無しさん:2011/06/20(月) 09:37:18.68
rubyスレ出身者のくせにこんな質問するとは恥ずかしいなお前ら
http://hibari.2ch.net/test/read.cgi/php/1289117484/812

質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
267デフォルトの名無しさん:2011/06/20(月) 10:54:51.54
>>252
#valが必須というわずらしさはあるけど、こんな感じで。ちょっと見づらいかも。
  
class LimitedNumeric
  def initialize(val, min=-1.0/0, max=1.0/0)
    @min, @max = min, max; self.val = val
  end
  attr_reader :val, :min, :max
  def val=(v)
    @val = (v > @max) ? @max : (@max >= v and v > @min) ? v : @min
  end
  def min=(min)
    @min = min; self.val = @val
  end
  def max=(max)
    @max = max; self.val = @val
  end
end

a = LimitedNumeric.new(0, 0, 10) # => #<LimitedNumeric:0x81fe944 @max=10, @min=0, @val=0>
a.val -= 5; a # => #<LimitedNumeric:0x81fe944 @max=10, @min=0, @val=0>
20.times{ a.val += 1}; a # => #<LimitedNumeric:0x81fe944 @max=10, @min=0, @val=10>
a.min = -5; a # => #<LimitedNumeric:0x81fe944 @max=10, @min=-5, @val=10>
a.max = 5; a # => #<LimitedNumeric:0x81fe944 @max=5, @min=-5, @val=5>
a.val = -20; a # => #<LimitedNumeric:0x81fe944 @max=5, @min=-5, @val=-5>
20.times{ a.val += 1}; a # => #<LimitedNumeric:0x81fe944 @max=5, @min=-5, @val=5>
268デフォルトの名無しさん:2011/06/20(月) 11:32:32.90
半分くらい実装したんだが、いわゆる「整数コンテナ」だと気付いたのでやめた
整数を入れる入れ物クラスは作ってはいけない
269デフォルトの名無しさん:2011/06/20(月) 11:46:21.24
このスレが過疎ったのは俺が質問してないから
この板で延びてるスレはたいていおれが質問してるから
俺を探すなら伸びてるスレをチェックしたらよい
270uy ◆yyC0rYWEq2 :2011/06/20(月) 15:34:35.15
>>268
理由を聞きたい
271192:2011/06/20(月) 16:13:40.99
楽しいRuby3で勉強しているのですが、require でライブラリを呼び出したいのですが、本通りにうまくいきません。
実行ファイルの保存場所とかに問題があるのでしょうか?
272デフォルトの名無しさん:2011/06/20(月) 16:28:46.61
require "./なんとか" で、なんとかならない?
273192:2011/06/20(月) 16:40:46.95
>>272
ありがとうございます。いままでずっとうまくいかなかったんですが、
不思議となんとかなりました。
274デフォルトの名無しさん:2011/06/20(月) 16:48:28.98
たのしいRuby 3版は1.8と1.9の両対応らしいのだが、
LOAD_PATHの仕様変更についての言及はないのだろうか?
>>192 が気付けなかっただけだろうか?
275デフォルトの名無しさん:2011/06/20(月) 16:51:10.31
1.9ではなく1.9.2からの仕様変更だったかと
初心者がハマるのも無理は無い
276192:2011/06/20(月) 16:52:07.12
続けて質問なんですが、
open-uri-sample.rb

require 'open-uri'
open("http://www.ruby-lang.org/ja/") do |f|
5.times do
print f.gets
end
end
と、うちこんで実行した場合に、出力された日本語が文字化けしてしまいます。
ruby-Ks open-uri-sample.rb と入力しても文字化けしたままでだめでした。
解決方法はありますでしょうか?
277192:2011/06/20(月) 16:57:02.21
>>274
ファイルの場所を移動させたり、GEMをダウンロードしたり
いろいろやっていたら、いつのまにかうまくrequireがうごくようになりましたが原因を理解していないので
LOAD_PATHの仕様変更調べてみます。本にはのってないようです。
ありがとうございます。rbuy 1.87のruby consoleをつかっています。
278デフォルトの名無しさん:2011/06/20(月) 17:04:47.22
>>274
>たのしいRuby 3版は1.8と1.9の両対応
ちょっと違う
1.8.7 と 1.9.1 の両対応だ
279デフォルトの名無しさん:2011/06/20(月) 17:16:13.13
>>276
なんかいろいろめんどくさいな

えー、Ruby1.9.xのopen-uriはレスポンスヘッダのcharsetを読んでString#force_encodingする
http://www.ruby-lang.org/ja/ のレスポンスヘッダのContent-Typeは

Content-Type: text/html;charset=utf-8

なので、戻り値の文字列は force_encoding('UTF-8') されている
つまり、そこで print した文字列 f.gets は UTF-8 だ

スクリプトの実行結果を UTF-8 表示できる手段に通すか、
スクリプト側の文字列表示時に、たとえばWindowsのコマンドプロンプトなら

print f.gets.encode('Windows-31J')

と書く
280デフォルトの名無しさん:2011/06/20(月) 18:03:17.93
UTF-8から変換する時は、エラー出さないように変換オプション も渡したほうがいいと思う
281192:2011/06/20(月) 18:15:26.68
>>279 >>280
ありがとうございます。いろいろ試していたのですが、まだ文字化け解消しません。
print f.gets.encode('Windows-31J')と書くとありますが、実行ファイル内に書いてみたり、
ruby print f.gets.encode('Windows-31J') openuri-sample.rb と書いて実行してみたりしたのですが、うまくいきません。
ruby consoleをクリックすると出てくるWindowsのコマンドプロプントを使っています。
282デフォルトの名無しさん:2011/06/20(月) 18:38:37.97
基本的なコンセプトとして、インターネットは魔境なので、不用意に接続してはいけない
インターネットそのもの(ってなんだ)を扱うのでない限り、サンプルにするのは極めて不適当

そういう意味で、OpenURI#read は本の真ん中へんくらいに出てくる技術
文字列とはなんぞやとか、メソッドとはなんぞとか、文字エンコーディングの違いってなにとか、
そういうことはそれなりに理解している人が使う

ということで、まだ早い
283デフォルトの名無しさん:2011/06/20(月) 18:44:03.17
>>282
>そういうことはそれなりに理解している人が使う
には賛同なのだが

# open-uri ライブラリを読み込む
require 'open-uri'
# http://www.ruby-lang.org/ja/ に接続し、
# なんかreadとかgetsとかできるオブジェクトをブロック引数 f に
open("http://www.ruby-lang.org/ja/") do |f|
# メモリはだいじなので古式ゆかしく5回getsを繰りかえして文字列を取得
5.times do
# 接続結果のオブジェクト(IOオブジェクト)のgetsメソッドが返す「改行までの文字列」をprintする
print f.gets
end
end

という流れだとわかってもらえてないとわりとつらい
284デフォルトの名無しさん:2011/06/20(月) 18:50:16.68
んで、文字列を返す f.gets が返してるものが UTF-8 になってて、これをそのまま print している
Windows のコマンドプロンプトは UTF-8 をまともに扱えないから、
print する文字列を「コマンドプロンプトが表示できるような文字列」にしなければならない

これは今のところは単に文字エンコーディングの違いに起因するもので、
コマンドプロンプトでは(Ruby1.9のEncodingがサポートしているエンコーディング名称中では)Windows-31Jの文字列なら
きちんと日本語として表示できる

ということで、f.gets の戻り値を String#encode で変換する
変換されていない文字列はなにをどうやっても化けるので、残しておいてはいけない

require 'open-uri'
open("http://www.ruby-lang.org/ja/") do |f|
5.times do
print f.gets.encode('Windows-31J')
end
end
285デフォルトの名無しさん:2011/06/20(月) 18:57:03.93
encode に :invalid => :replace, :undef => :replace は必須だろう
286デフォルトの名無しさん:2011/06/20(月) 19:01:28.28
>>285
必須だと思うならデフォルト値にしとけカスって言っとけ
287デフォルトの名無しさん:2011/06/20(月) 19:06:22.80
IOのエンコーディングにinvalidとかのオプションってどうやって渡すの?
288デフォルトの名無しさん:2011/06/20(月) 19:13:31.91
>>287
それはできない

…うん、できないはず
それをやる方法を探したのでおぼえてる
289デフォルトの名無しさん:2011/06/20(月) 19:14:51.11
不便やねー
290デフォルトの名無しさん:2011/06/20(月) 19:17:18.54
>>285
わけもわからず抑制型オプションつけさせるのって嫌いなのよね
説明してあげてください
291デフォルトの名無しさん:2011/06/20(月) 20:15:32.81
エラーが出てくるだけで何もうれしくないぞ
292デフォルトの名無しさん:2011/06/20(月) 21:10:58.49
#!/usr/bin/ruby
require 'find'

DIR1= ["/ruby/", "/ruby_doc/", "/ruby_tools/"]
IGNORES = [ /^\./, /^CVS$/, /^RCS$/ ]

DIR1.each do |path|
Find.find(path) do |p2|
if FileTest.directory?(p2) # pathがディレクトリならば
dir, base = File.split(p2)
IGNORES.each do |re|
if re =~ base # 無視したいディレクトリの場合
Find.prune # それ以下の検索を省略する
end
end
end
if File.basename(p2) =~ Regexp.new(ARGV[0])  #エラー
puts p2 # 出力する
end
end
end

Exception `TypeError' at dirlist.rb:17 - can't convert nil into String
でエラーになります。
正規表現でファイル検索する。検索する複数ディレクトリと
検索しない除外ディレクトリをプログラムで解決したいです。
どうすればいいのでしょうか?
293192:2011/06/20(月) 21:25:13.67
>>284
ありがとうございます。みなさんもありがとうございます。
いまだにできていませんが、実力不足なので、ゆっくり自分で解決できるまでがんばります。
294デフォルトの名無しさん:2011/06/20(月) 21:30:48.82
>>292
起動時に引数指定すれば?
295デフォルトの名無しさん:2011/06/20(月) 21:33:39.49
Regexp.new を使う人がいるのはなぜだろう
っていうか、誰が広めてるんだろう

#!/usr/bin/ruby
# -*- coding: utf-8 -*-
if ARGV.empty?
raise "Needs ARGV"
else
@target = /#{ARGV[0]}/
end
require 'find'

@dir1= ["/ruby/", "/ruby_doc/", "/ruby_tools/"]
@ignores = [ /^\./, /^CVS$/, /^RCS$/ ]

@dir1.each do |path|
Find.find(path) do |p2|
if FileTest.directory?(p2)
dir, base = File.split(p2)
# 無視したいディレクトリ名にヒットしたらサブディレクトリを検索しない
Find.prune if @ignores.any?{|re| re =~ base}
end
puts p2 if @target =~ File.basename(p2)
end
end
296uy:2011/06/20(月) 21:37:47.03
かなり意味不なんだけど、Dir[]を知らずにそれをかいてるわけじゃなくて
Dirではかけずにかいている?

Dir["{ruby,ruby_doc,ruby_tools}/*.*"].each do | m |
  if m =~ /(test.*)/
     p m
  end
end

たぶんエラーの原因は、引数から受け取ったARGV[0]はRegexpじゃなく文字列だからそのまま評価するんじゃなく
eval等をしないとしぬ
297デフォルトの名無しさん:2011/06/20(月) 22:06:19.87
>>295 俺一時期、なんでもかんでも明示的に書きたがった時期があって、
Regexp.new 使いまくってましたね。
298デフォルトの名無しさん:2011/06/20(月) 22:28:19.29
Regexp.newはキャッシュされないから遅いし、
かなり有名な記法である /re/ のほうがよっぽど明示的だ
299デフォルトの名無しさん:2011/06/20(月) 22:47:02.94
>>295さん
>>296さん
素早いコメント有難う御座います。
Regexp.new古い本は当たり前のように書いてあります。
ここ数年の新しい本も最初の方にありますね。

せっかくですのでどなたかRegexp.newを書き換えよう!みたいなサイトを
ご紹介いただけると幸いです。
300デフォルトの名無しさん:2011/06/20(月) 22:57:45.55
そりゃ書いてはあるだろう
しかし使ってはいない
Array.new のようなもの
301デフォルトの名無しさん:2011/06/20(月) 23:09:30.73
%r!regexp!
%w(a b c)
123_456

オレは、はじめての言語が Java なんだけど
こういう書き方を使ったときはドキドキした
302デフォルトの名無しさん:2011/06/20(月) 23:13:23.72
Ruby においては、リテラルで書ける場合はリテラルで書いたほうがおおむね爆速

str = String.new ではなく str = "" と書く
arr = Array.new ではなく arr = [ ] と書く
もし data = [] と data = {} で data がどっちなんだかわかりにくいのだとしたら、
そりゃ変数名が悪いんだよとか言っておく

正規表現においてはオブジェクト使い回しが効く場合はリテラルのほうがバカ速い
変数埋め込みしかない場合は Regexp.new(val) も /#{val}/ も同じか、リテラルのほうが微妙に遅い
303デフォルトの名無しさん:2011/06/21(火) 00:22:08.31
Pythonで任意の二つのキーを一組としたハッシュを配列にして、そこにデータを追加したい
場合、タプルを使って次のように書けます。

from collections import defaultdict
hash = defaultdict(list)
hash[('a', 'b')].append('111')

Rubyはタプルがないと思いますが、こういう機能を実現するにはどうすればいいでしょうか?
見通し良く実装できる方法があれば知りたいです。
304291:2011/06/21(火) 00:27:03.39
>>302
有難う御座います。勉強になります。
305292:2011/06/21(火) 00:31:49.49
すいません。304は名前欄間違えました。292です。
306デフォルトの名無しさん:2011/06/21(火) 00:39:02.95
>>303
こっちのスレまで荒らさないでください
307デフォルトの名無しさん:2011/06/21(火) 00:43:31.89
タプルなんて必要ないだろ。
リストがあるんだし。リストをキーにしたハッシュにすればいいんじゃね?
308デフォルトの名無しさん:2011/06/21(火) 00:53:42.93
Pythonにリストとタプルがある点は賛否両論だったなぁ。
需要はわかるんだが。
309デフォルトの名無しさん:2011/06/21(火) 00:59:04.57
タプルは要素の変更ができないからhashのkeyにできる。listはキーにできない。
Rubyも同じでしょ。上のようなコードはrubyじゃ無理じゃないかな。試してないけど。
310デフォルトの名無しさん:2011/06/21(火) 01:02:11.00
freezeされた配列かStructを使うのかねぇ。
311デフォルトの名無しさん:2011/06/21(火) 01:03:29.37
複製して凍らせたのをキーにすりゃいいかね
312デフォルトの名無しさん:2011/06/21(火) 01:04:32.32
>>309
Rubyはそういう制限ないよ
PythonはイミュータブルじゃないとTypeErrorだけど
313デフォルトの名無しさん:2011/06/21(火) 01:07:21.15
>>312
なるほど。
キーの内容が変わっちゃっても問題ないのかな?
Pythonのtupleの説明で、変えられないのがtupleの利点、ってのを読んだことがあったんだけど。
そんな制限はほんとは必要ないってことなのかな? わざわざ独立データ型とするほどの。
314デフォルトの名無しさん:2011/06/21(火) 01:15:57.60
irb(main):001:0> hash = {}
=> {}
irb(main):002:0> key = [1,2,3]
=> [1, 2, 3]
irb(main):003:0> hash[key] = :value
=> :value
irb(main):004:0> hash
=> {[1, 2, 3]=>:value}
irb(main):005:0> key[2]=300
=> 300
irb(main):006:0> key
=> [1, 2, 300]
irb(main):007:0> hash
=> {[1, 2, 300]=>:value}
irb(main):008:0> hash[key]
=> nil
  ↑ふしぎ!!
315デフォルトの名無しさん:2011/06/21(火) 01:26:42.87
あぁ、Object#hashの戻り値が変わったからか。
ふしぎじゃなかった!
316uy:2011/06/21(火) 01:27:07.57
require 'rinda/rinda'

n = Rinda::Tuple.new( [44,55,66] )
c = { n => :test }
p c[n]

p n.value
n.value[2] = 88
p n.value

p c[n]
317デフォルトの名無しさん:2011/06/21(火) 01:27:34.86
よし誰かコミッターにたのんでタプル追加してもらおう
318uy:2011/06/21(火) 01:32:48.14
[]も{]も使われててタプルをあらわす記号なんてあまってネーよ
記号を増やすべき
319デフォルトの名無しさん:2011/06/21(火) 02:10:20.48
>>313
だからrubyは遅い
320デフォルトの名無しさん:2011/06/21(火) 17:04:21.65
2011/06/21(火) 16:58:27.65 - 2011/06/21(火) 16:51:27.65 を計算する方法を教えてください
321デフォルトの名無しさん:2011/06/21(火) 17:11:50.17
すいません途中で送信してしまいました

2011/06/21(火) 16:58:27.65 - 2011/06/21(火) 16:51:27.65 を計算すると秒が求められるのですがそれを1:30:20(時:分:秒)にする方法を教えてください
322デフォルトの名無しさん:2011/06/21(火) 17:19:25.27
あ、それできないんよ
323デフォルトの名無しさん:2011/06/21(火) 17:34:56.77
そういえばTimeSpan的なクラスはないな。
計算するだけなら60で割って60で割ってだけど。
324デフォルトの名無しさん:2011/06/21(火) 17:42:17.21
日時が英語でdata timeなんだから、

日クラス Date
時クラス Time
日時クラス DateTime(現行のTimeクラス)

にしたらよかったのにな。
325デフォルトの名無しさん:2011/06/21(火) 17:56:48.82
それはいかがなものか
326デフォルトの名無しさん:2011/06/21(火) 18:10:56.22
なんで、いいじゃん。おれとしては

Dateインスタンス + Timeインスタンス で DateTimeインスタンスを返してほしいな
327デフォルトの名無しさん:2011/06/21(火) 18:23:48.52
女の子とのデートタイム
328デフォルトの名無しさん:2011/06/22(水) 02:37:02.45
モテない教祖を持つと信者が苦労する典型w
329デフォルトの名無しさん:2011/06/22(水) 03:29:20.98
330デフォルトの名無しさん:2011/06/22(水) 04:24:06.85
>>329
Matzうらやましい。超うらやましい。けしからん
331デフォルトの名無しさん:2011/06/22(水) 07:41:54.92
>>324
TimeとTimeSpanの2つでいいんだよ
Timeを大きくしたくなかったから分かれてしまったけど、実用上は失敗だと思う
拡張TimeとDateとDateTimeとParseDateは require 'time' 一発で読まれて、Timeクラスの拡張として振る舞うべき

def timespan(end_time, start_time)
require 'time'
t2 = end_time.kind_of?(Time) ? end_time : Time.parse(end_time)
t1 = start_time.kind_of?(Time) ? start_time : Time.parse(start_time)
Hash[*%w(sec min hour day month year).zip(t2.to_a[0..5].zip(t1.to_a[0..5]).map{|a| a[0] - a[1]}).flatten]
end

def timespan_to_s(end_time, start_time, format='hour:min:sec')
str = format.dup
timespan(end_time, start_time).each{|name, value| str.sub!(/#{name}/){value}}
str
end

t2, t1 = '2011-06-22 08:23:45', '2011-06-22 07:00:00'
p timespan(t2, t1) #=> {"month"=>0, "hour"=>1, "day"=>0, "sec"=>45, "year"=>0, "min"=>23}
p timespan_to_s(t2, t1) #=> "1:23:45"
puts timespan_to_s(t2, t1, 'hour時間min分sec秒') #=> 1時間23分45秒
332デフォルトの名無しさん:2011/06/22(水) 07:53:20.95
自分の娘が踊ってみたとかいってyoutubeに動画をあげてたら、
たぶん怒り狂ってこの世の全てのルートサーバを破壊しつくすと思う。
333デフォルトの名無しさん:2011/06/22(水) 08:03:37.31
>>331
引き算の配列を Time.local に渡せば strftime('%H%M%S') が使えるんじゃなかろうか
334デフォルトの名無しさん:2011/06/22(水) 08:10:39.21
>>333
それは「2ヶ月と30日」とかを投げると2月30日になってエラーになる気がするのでやめた
日数までなら平気なんだけど
335デフォルトの名無しさん:2011/06/22(水) 14:02:47.67
1970/2/30とかになるんだろう。そういや自作スクリプトで分と秒は出るのに時間が出てなかったな。
もう一回60で割ればいいのか?
336デフォルトの名無しさん:2011/06/22(水) 16:14:11.00
337デフォルトの名無しさん:2011/06/22(水) 17:25:42.54
>>336
bizinformation.orgは適当
客観的根拠はとくにない
338デフォルトの名無しさん:2011/06/22(水) 17:38:34.86
初心者にはこの本をおすすめ
ttp://www.amazon.co.jp/dp/4777514315/
339デフォルトの名無しさん:2011/06/22(水) 18:51:07.28
本気にしたらどうすんだ、馬鹿野郎
340デフォルトの名無しさん:2011/06/22(水) 18:54:51.81
1月31日の1ヵ月後の1ヶ月前は何月何日?
341デフォルトの名無しさん:2011/06/22(水) 19:02:28.66
そんなのお前が決めることだ
342デフォルトの名無しさん:2011/06/22(水) 19:05:25.51
>>340
>1月31日の1ヵ月後
は、2月の末日(民法143条の2)
>1月31日の1ヵ月後の1ヶ月前
は、1月28日(29日)か、1月31日
通常は期間だけを計算したあとにおもむろに適用するので、0ヶ月を適用して1月31日
コンピュータで順番に計算すると一般的な答とは乖離する例
343デフォルトの名無しさん:2011/06/22(水) 19:25:52.89
>>338
Rubyの冒険とかそんなタイトル前にもなかったっけと思ったらやっぱり出てるか

Rubyの冒険 旅立ち篇―Rubyで簡単プログラミング入門 [単行本]
出版社: 毎日コミュニケーションズ (2003/08)
http://www.amazon.co.jp/dp/4839910413/
344デフォルトの名無しさん:2011/06/22(水) 22:25:37.03
WindowsのコマンドプロントからUTF-8のwebサイトの内容を取得して表示するときは
ファイルの先頭に
# coding: Windows-31J
$stdout.set_encoding(Encoding::Windows_31J, Encoding::UTF_8)

とかいておけばいいですか?
345デフォルトの名無しさん:2011/06/22(水) 22:37:05.75
使うライブラリによるんじゃないの
346デフォルトの名無しさん:2011/06/22(水) 23:20:33.82
IOでの変換は、オプション指定できないみたいだから、変換できない文字があるとエラーで止まっちゃうでしょ。
だからputs str.encode(Encoding::Windows_31J, :invalid => :replace, :undef => :replace)
みたいにしないといけないんじゃないの?
やってることが1.8から進歩してないが、設計ミスのような気がしてならない。
347デフォルトの名無しさん:2011/06/23(木) 00:35:01.74
>>344
それの存在は忘れろ
二度と使ってはならない

ああ、最初にそれ持ち出した奴ぶん殴りたい
348デフォルトの名無しさん:2011/06/23(木) 01:02:46.49
いわゆるグローバル変数でもあるしな

だから puts 等のそばに記述されるべきだが、
それだったら puts のときに文字列を String#encode したり
File オブジェクトのエンコーディングを変更したりするほうが素直だ

puts str

open('kekka.txt', 'wb'){|f| f.puts(str)}
が出力する文字列違うというのもキモい

そりゃこのへんも統一的に指示できれば美しいが、世界がそのようにはなっていないので…
349デフォルトの名無しさん:2011/06/23(木) 01:39:41.52
>>344
Ruby 1.9 の文字列(String オブジェクト)は2つの情報がセットになってる
実際のバイナリ列と、文字エンコーディングの名前
String#encode(to) または String#encode(to, from) はバイナリ列を from(かselfの文字エンコーディング名) から to に変換し、名前も to に変更する
String#force_encoding(new) はバイナリ列は変更せずに、文字エンコーディングの名前の情報部分だけを new にすげかえる

String#encode または内部でそれを呼んでいるメソッドにおいては、
変換元の文字エンコーディング名(と変換先の文字エンコーディング名)は明示的に指定されなければならない
「まったくわけがわからない」不明な文字エンコーディングの String の encode メソッドを使用することはできない

で、通常、Net::HTTP を使用して Web サーバから取得して作成された文字列の文字エンコーディングは不明(ASCII_8BIT、別名BINARY)だ
人間が人力で、なんからの信頼できる情報源から文字エンコーディングを確定して、
変換前に String#force_encoding してやるか String#encode の第2引数に指定してやらなければならない

ということで、
html.force_encodeing(HTMLの正しい文字エンコーディング)
str = html を「HTMLの正しい文字エンコーディング」名義でどうにかする(正規表現とか)
puts str.encode('Windows-31J') # コマンドプロンプトに表示したい場合
というのがたぶん妥当

日本語限定で、あらかじめ文字エンコーディングがわかっているサイトを巡るのではないのなら、
HTML を NKF.guess してしまうのがいちばんめんどくさくない気はする

とまあ眠い目の中ここまで長文書いて、元レスの HTML は UTF-8 限定だということに気がついた
取得した HTML の文字列が UTF-8 であるのなら、UTF-8 から Windows-31J への変換でいいんじゃないのかね
変換エラーでおっこちるようなら>>346か、require 'kconv' して tosjis でも使っとけ
350デフォルトの名無しさん:2011/06/23(木) 01:51:27.70
つまりどういうことです?
351デフォルトの名無しさん:2011/06/23(木) 02:04:12.21
1.9は失敗作
352デフォルトの名無しさん:2011/06/23(木) 02:57:40.01
ああ来月待つみたいなリテラルは欲しいな。
month++;
みたいなw
353デフォルトの名無しさん:2011/06/23(木) 02:59:49.62
正直2.0の完成度を高める為なら、1.9.9xxとか900回以上リリースしまくってもいいとは想うw
354デフォルトの名無しさん:2011/06/23(木) 03:42:58.55
1.9.9563519とかになるのか
355デフォルトの名無しさん:2011/06/23(木) 07:56:46.28
6月30日の1ヵ月後ってドメインによっては7月30日だったり7月31日だったりするんだろうか?
356デフォルトの名無しさん:2011/06/23(木) 08:14:58.73
>>355
6月30日の「1ヶ月後」はフツーのグレゴリオ暦使ってれば常に7月30日
ユリウス暦とか太陰暦とかインカ暦とか使ってる場合はたぶんなんか適当に計算されるんだろう
どちらにしても、「月の部分に1だけ足して、その月に存在しない日になったらその月の最終日に丸める」という処理は一般的だと思う
そういう処理をしてもらっては困る場合は「31日後」などという表現を使う
357デフォルトの名無しさん:2011/06/23(木) 08:29:53.24
うむ
6月30日に1日足した結果の"6月31日"は7月1日に変換されなければならないけど、
5月31日に1ヶ月足した結果の"6月31日"は6月30日に変換されなければならない
プログラム中の中間データとしては全く同一であるはずなのに

このめんどくさい処理をなんとかするために、Date クラスは Date#>> を作った
irb> p (Date.parse('2011-05-31') + 31).to_s
"2011-07-01"
irb> p (Date.parse('2011-05-31') >> 1).to_s
"2011-06-30"
「1ヶ月」という期間を加算減算したい場合は >> と << を使ってねという話
358デフォルトの名無しさん:2011/06/24(金) 10:56:42.18
gemライブラリにそこそこの変更を入れてみたんだが、テストでエラーが出なかった
どうやらこの部分の単体テスト自体がなかったらしい

ぬう、変更前のテストから作れということか
めんどくさいのう
359uy ◆KOAgYBL/Xg :2011/06/24(金) 10:58:53.25
Rubyってツリーを扱いたい時ってどうしたらいいの?
こういう抽象化しにくいのはやっぱり自分でかいていくしかないの?
360デフォルトの名無しさん:2011/06/24(金) 12:41:48.63
ないだろ。
ちょっとした用途ならArray/Hashの入れ子程度で賄われるし
ちょっとどころでない用途ならREXMLみたいに
解きたい問題に特化した構造で作り込まれるだろうしで。
361デフォルトの名無しさん:2011/06/24(金) 18:48:30.25
Wikipediaで見たRubyサンプルコードに
->(x){(略)}
ってのがあったんですが、リファレンスのどこに書いてありますか?
362デフォルトの名無しさん:2011/06/24(金) 18:51:27.32
>>360
どれに対する回答なの?
363デフォルトの名無しさん:2011/06/24(金) 19:07:32.22
>>361
Ruby1.9のlambdaかProcのとこに書いてあるかもしれない
364デフォルトの名無しさん:2011/06/24(金) 19:56:56.35
そこにはありませんでした。
Rubyで使われる記号の意味にありました。
365デフォルトの名無しさん:2011/06/24(金) 21:09:19.81
>>362
あぼーんアピールを繰り返すにはまだ間が空いてない
366デフォルトの名無しさん:2011/06/24(金) 21:34:10.63
windows ruby1.9.2と相性良くて初心者でもいけるxmlライブラリってありますか?
rexmlが難しかったので
367デフォルトの名無しさん:2011/06/24(金) 21:59:26.96
XMLで何をしたいの?
DOMやりたいなら現状REXML以外にメジャーなものはなかったと思う。

htreeは日本語のチュートリアルとかざっと探してもなさそうだし初心者だと難しいかなぁ。
368デフォルトの名無しさん:2011/06/24(金) 22:30:18.54
実行した時間をxmlに記録していきたいのです
369デフォルトの名無しさん:2011/06/24(金) 23:00:21.11
書くだけならライブラリも何も無くていいんじゃない?
ライブラリは主に解析とかパースに使うもんだと思ってる
370uy ◆KOAgYBL/Xg :2011/06/24(金) 23:25:50.41
>>360
把握
自分でかいていきます
371デフォルトの名無しさん:2011/06/25(土) 03:32:31.35
質問です。2^N次アダマール行列をシルベスターの生成法[*1]により生成するコードを書いてみたのですが、エラーが出て実行出来ません。書いたコードは以下の通りです。
#プログラム hadamard.rb Ver.0.1
N=4
require 'matrix'
class Matrix
def []=(i,j,x)
@rows[i][j]=x
end
end
h=Matrix[[1,1],[1,-1]]
if N>1 then
for k in 1..N-1 do
for i in 0..2**k-1 do
for j in 0..2**k-1 do
h[i,j+2**k]=h[i,j]
h[i+2**k,j]=h[i,j]
h[i+2**k,j+2**k]=-h[i,j]
end
end
end
end
p h
Matrixクラスを使うに当たってリファレンス[*2]を参照し、要素に数値を代入するメソッド定義のコードをコピペしました。
実行時に出てきたエラーメッセージは以下の通りです。
D:/ドキュメント/プログラム/Ruby/rbEA75.tmp:11:in `[]=': undefined method `[]=' for nil:NilClass (NoMethodError)
以下省略
実行環境はVista 64bit、ActiveScriptRuby[3]、RDE[*4]です。
[]=メソッドが定義されてねぇぞ(゚Д゚)ゴルァ!!と言っているように見えるのですが、よく分かりません。よろしくお願いします。
[*1]http://ja.wikipedia.org/wiki/アダマール行列
[*2]http://www.ruby-lang.org/ja/man/html/Matrix.html
[*3]http://www.geocities.co.jp/SiliconValley-PaloAlto/9251/ruby/
[*4]http://homepage2.nifty.com/sakazuki/rde/index.html
372uy ◆KOAgYBL/Xg :2011/06/25(土) 04:21:25.11
class Matrix
  def []=(i,j,x)
  p i , j , x
  p @rows
    @rows[i][j]=x
  end
end

これで、表示させてみたところこうなった
0
2
1
[[1, 1], [1, -1]]
2
0
1
[[1, 1, 1], [1, -1]]
@rous[ 2 ][ 0 ]にアクセスしようとしたけど
@rousは [ 0 ] と [ 1 ] しかまだ持ってないからエラーでてる
Matriksが何のライブラリで何をするものか俺しらんのでイミフだけどこうすりゃ一応うごく
class Matrix
  def []=(i,j,x)
    if @rows[i].nil?
      @rows[i] = []
    end
    @rows[i][j]=x
  end
end
373デフォルトの名無しさん:2011/06/25(土) 06:10:21.83
もう見るまでもないな
Rubyには2次元配列は存在しない
単なるメソッドチェーンに過ぎない
foo[x][y] としたとき、実際に試されるのは foo の x y 番地ではなく foo[x] が返すオブジェクトの [y] だ
foo[x] の時点で整数や nil であるとき、 foo[x][y] は 3[y] や nil[y] を試そうとして NoMethodError を発生させる
374デフォルトの名無しさん:2011/06/25(土) 06:34:55.98

N = 4
for k in 1..N-1
p k
end
ちなみに↑と↓は同義な、 ifのthenやforのdoも省略可能
for k in 1...N
p k
end
375デフォルトの名無しさん:2011/06/25(土) 07:04:49.68
ありがとうございます、>>373さんの説明でわかったような気がします
ようするにMatrixは配列の配列を作っているだけなので
N×N行列hの(i,j)成分に対して,行と列をそれぞれ二倍に拡張して2N×2Nの行列にするとき
h[i,j+2**k]は配列オブジェクトh[i]がすでにあるので大丈夫だけど
h[i+2**k,j]は配列オブジェクトh[i+2**k]が無いのでこれを
h[i+2**k,j]=[]として作ってやらないとアクセスできない
そのあと
h[i+2**k,j+2**k]にアクセスするときは上で配列h[i+2**k]が作られているのでアクセスできる
というところでいいんでしょうか?

いままではPASCALでやっていたので最初から扱う最大の次数の多次元配列をつくっていたので問題はでなかったのですが
Rubyだと宣言なしで動的に使えて、いきなり配列の中のぶっ飛んだ成分にアクセスできていたので、同じことが行列でもできるだろうと油断していました ・・・

doやthenは省略できるみたいですが、これって省略するのが普通なんでしょうか?
とりあえずちゃんと書いた方がいいと思って書いたのですが
上ではputs hと書いてしまいましたが本来ならちゃんとカッコをつけた方がいいんでしょうかね
オブジェクト...オブジェクト で終端を含まない範囲オブジェクトを作れるのは知りませんでした・・・参考になります。
376デフォルトの名無しさん:2011/06/25(土) 07:29:57.28
>h[i+2**k,j]=[]として作ってやらないとアクセスできない
あい
これを自動で作る方法はなくもないけれど、とりあえず自分で条件つけて自分で書いて作るのが安心確実かと思う
こんなとこに魔法使っても得しないw

do や then はあまり省略しないというか、省略ではなく「do や then を書くか、改行を書くかのどちらか2択」だ
Ruby の条件部は空白が許されていて、どこまで続いてるのか書き忘れがないのかがよくわからないので、
if(条件) のような区切り書きの役目を if 条件 then に負わせることがよくある
「アタマイイヒト」はなんでもかんでも省略して空白区切りにまかせて書くけど、正直推奨しない

あと、puts と print と p は伝統的に誰もカッコ書かないというか、下手にカッコ書くと時々妙に見える動作をする

>オブジェクト...オブジェクト で終端を含まない範囲オブジェクトを作れるのは知りませんでした
読めればそれでいいよ、あんまり自分から使うもんじゃない
理由は、まあ、見たまんまだなw
>>374みたいなのは参考にしたらだめこ
377uy ◆yyC0rYWEq2 :2011/06/25(土) 08:07:59.37

推奨って「 誰が 」 言ったのか詳しく

あまりこのスレでは口出ししないようにしてきたが流石に
変なこと教えんな いや、自分の考えを押し付けるなと。
Rubyを何の用途に使ってたらいちいちdo、thenつけるんだよ 複数行に分けてるにもかかわらずthen doつけるなんてそうそう見た事ねーよ
教科書コードとしても微妙
無駄に冗長させるだけ、そもそもifを一行でかくなら後置きIFにする そうすることで
thenとendと空白をあわせて 9文字くらいタイプ量を減らせるんじゃないのか

もう一度いう、
推奨って「 誰が 」 言ったのか詳しく


とりあえず標準Libのソースコードで語るなら
if thenはやってる箇所はあったけど、for doについては、やってる箇所はひとつもないよ
378デフォルトの名無しさん:2011/06/25(土) 10:15:11.22
多次元配列でやりたい大抵のことは配列の配列にメソッドチェインで事足りる。

内部配列が見えない真正の多次元配列が欲しけりゃそういうクラスを作れば十分で、
「Rubyに多次元配列は存在しない」とドヤ顔するほどのことでもない。
379デフォルトの名無しさん:2011/06/25(土) 10:20:49.44
>多次元配列でやりたい大抵のことは配列の配列にメソッドチェインで事足りる
つまり多次元配列は存在しないってことだろ

「配列の配列」と「多次元配列」はぜんぜん違う
380デフォルトの名無しさん:2011/06/25(土) 10:28:32.98
そこまで言って両者の定義を示さないってすごいな
381デフォルトの名無しさん:2011/06/25(土) 10:31:17.84
たとえぜんぜん違っても使うときには大して違いを気にしなくていい程度の使い方しかされない
だから「つまり多次元配列は存在しない」とドヤ顔するほどのことでもない。
382デフォルトの名無しさん:2011/06/25(土) 10:45:40.57
配列の配列はただのネストした配列で、隣りに誰がいるかとか、自分がどこにいるかとかを全く知らず、self と自分の関係しか知ることができない
多次元配列は self にすべてを問いあわせることができて、self は全ての番地を知っている

こんな感じ?
違うっちゃ違うな
383デフォルトの名無しさん:2011/06/25(土) 10:50:42.63
>>382
作った配列の筋に依存するというのも結構…

てか、Ruby における配列の配列は配列の配列としてしか使用されてないはず
配列の配列を2次元配列として使っているとしたら、それは単に間違い

でも大学の授業でよくあるが
384デフォルトの名無しさん:2011/06/25(土) 11:01:38.81
arr[1][3] は arr[1] の [3] であって、それ以上でもそれ以下でもないなあ…
配列が配列の中に入ってたら、それはネストした配列だろ
配列オブジェクトの(要素の)中に、また別の配列オブジェクトがごろんと入ってるだけ

むしろ、なぜわざわざ二次元配列だと考えるのかが謎だ
385デフォルトの名無しさん:2011/06/25(土) 11:05:04.91
他言語(Cとか)だと2次元配列のほうが簡単に書けるからそれを意識しちゃうんでしょ
386デフォルトの名無しさん:2011/06/25(土) 11:13:23.31
・ 配列オブジェクトというものをまったく意識しない
・ eachによる自己枚挙の利点がよくわからず、for で添え字アクセスばかりする

ような時期だと、ネストした配列と言われても何言ってるのこの人みたいにしか聞こえないと思うの
なまあたたたかく見守るべき
387デフォルトの名無しさん:2011/06/25(土) 11:22:09.81
てゆーか、 こんだけ広まってるってことは、 オブジェクトやイテレーションの概念を

 知 ら な い く せ に

a[0][1] のようなC/PerlちっくなアクセスのやりかたをRubyでやるように教えたアホがいるってことだよね、要は
それが広まってるんだ
彼らは被害者に過ぎない
388uy ◆yyC0rYWEq2 :2011/06/25(土) 11:27:38.81
多次元配列ないのと、
ListなのにArrayって名前付けちゃってんのはRubyの欠点だから
389デフォルトの名無しさん:2011/06/25(土) 11:39:36.09
PASCAL・C・FORTRAN教育の被害者だというのには同意はしておく

だからRubyとしての扱い方を知ってもらわないといけないんだが
「多次元配列は存在せず、ネストした配列かMatrixクラスで代替するしかありません」
というシンプルな事実を頑なに認めないのは単に老害の第一歩

次の方どうぞん
390デフォルトの名無しさん:2011/06/25(土) 12:29:10.26
低性能でエネルギーを過剰に浪費し、
温暖化を促進し人類を滅亡に導くってのはRubyの欠点だから
391uy ◆yyC0rYWEq2 :2011/06/25(土) 12:29:36.76
NArrayもあるけど、使ったことないな
392デフォルトの名無しさん:2011/06/25(土) 13:00:05.18
京都議定書がアメリカも参加した状態で守られたりしたとしても
2100年の平均気温上昇が0.15度抑えられる程度の効果しか無いけどな
393デフォルトの名無しさん:2011/06/25(土) 13:05:03.67
Rubyについてスレが建たないのでRubyはオワコンだと判断しました
394 忍法帖【Lv=2,xxxP】 :2011/06/25(土) 13:06:27.43
誰か Rubyについて Part 44 を立ててください。
395デフォルトの名無しさん:2011/06/25(土) 13:13:07.56
くだすれぴちょんスレ(仮名)も立ってないのでおあいこです

>>375
Matrixは行列を動的に拡張するような使い方は想定してないと思うよ
そこで定義してるMatrix#[]=はあくまで既存の成分の参照
396デフォルトの名無しさん:2011/06/25(土) 13:35:42.87
多次元配列が使われるパターンの多くが配列の配列で困らないから多次元配列が用意されていない。

「どうしても真正の多次元配列が欲しいときは自分が必要と思う機能を持たせたクラスを作ってね」
397 忍法帖【Lv=22,xxxPT】 :2011/06/25(土) 13:40:59.74
>>395は既存の成分の変更、の間違い
398 忍法帖【Lv=22,xxxPT】 :2011/06/25(土) 13:42:03.17
よし本スレ立ててくる。失敗するかもだけど
399デフォルトの名無しさん:2011/06/25(土) 13:46:53.21
>>398
頼む
こっちは駄目だった
400デフォルトの名無しさん:2011/06/25(土) 13:56:21.18
おまたせ
テンプレ誤りあったら1にアンカつきで指摘おねがい

Rubyについて Part 44
http://hibari.2ch.net/test/read.cgi/tech/1308977168/
401デフォルトの名無しさん:2011/06/25(土) 14:14:40.70
>>389
>多次元配列は存在せず
これはいいけど、
>ネストした配列かMatrixクラスで代替するしかありません
自分が必要なクラスを自分で書くっていう発想がないのは頭がおかしいから?
402uy ◆yyC0rYWEq2 :2011/06/25(土) 14:35:15.46
いちいちかまっていたらキリねーよ
必死な子が混ざってるのは質問の回答2〜4レス目から気づいてるけど、スルーしたほうがいい
403uy ◆yyC0rYWEq2 :2011/06/25(土) 14:35:31.42
uyにいわれたらおしまいですね。
404デフォルトの名無しさん:2011/06/25(土) 14:58:23.83
>>401
このスレの全部に「自分で作れ」をつけて回ってください
405デフォルトの名無しさん:2011/06/25(土) 15:04:49.89
>>404
『しかありません』


自分で作ることもできるし、ライブラリもあるんですけど
406デフォルトの名無しさん:2011/06/25(土) 15:17:36.75
>>404
言語側で用意されてなくて、代替じゃだめで、既存ライブラリもいや、という条件が揃ってるならつけて回るかな。
407デフォルトの名無しさん:2011/06/25(土) 15:30:38.52
           YES → 【他で代用可?】 ─ YES → そうしろ死ね
         /              \
【本当に必要?】                 NO → 【ライブラリある?】― YES → それ使え死ね
         \                            \
            NO → 死ね                       NO → 自分で作れ死ね

言語仕様上存在しないものについての話題ではこういう流れが自然であって、
「存在しない」「存在しない」とオウムのように繰り返すのは意味がないよね。
408デフォルトの名無しさん:2011/06/25(土) 15:39:13.44
顔真っ赤にして必死で探した「相手のミス」が「作れるって書いてない!!」というのは情けなくて涙が出る
409デフォルトの名無しさん:2011/06/25(土) 15:45:00.56
rubygemからnokogiriをインストールしたのですが
require 'nokogiri'
でnokogiriがno such file to load -- nokogiri (LoadError)となり、うまくいきません。

Nokogiriがうまくインストールされてるかどうかは
ruby -rrubygems -e 'require "nokogiri"; p Nokogiri::VERSION'
で確かめると"1.46と表示されます。

どの辺をチェックすればうまく使えるようになりますでしょうか?
410デフォルトの名無しさん:2011/06/25(土) 15:50:27.72
ついに「顔真っ赤」とか「情けない」とか人格攻撃しかできなくなったのね。

大抵代用可能
ライブラリあり
作るのに甚大な労力が必要なわけでもない
411uy ◆yyC0rYWEq2 :2011/06/25(土) 15:52:26.70
gem which nokogiri
412デフォルトの名無しさん:2011/06/25(土) 15:57:45.08
>>409
のこぎり使ったことないから知らんけど
require 'rubygems'
require 'nokogiri'
じゃないの
413デフォルトの名無しさん:2011/06/25(土) 16:19:41.92
入れ子配列と多次元配列が本質的に全然別物だろうが、
多次元配列が使われている多くのパターンが入れ子配列で代用可能であるという事実はゆるがないし、
その代用じゃ効かないときのためにNArrayなんてライブラリがあるのも確かだし、
代用もイヤ、既存ライブラリも不満、というときには「じゃあ自分で作れよ」と答えるのが普通だろう。

「Rubyに多次元配列は存在しない」なんて無意味なことをいう必要もないし、
「ネストした配列かMatrixクラスで代替するしかありません」なんて嘘をつく理由もない。

Rubyスレで「二次元配列使いたいんですけどー」とか言われたら
・それ配列の配列じゃダメ?
・NArrayでも使えば
・内部に一次元配列もって[x+y*width]でアクセスするクラスでも作ればいい
 幅が固定じゃないならそんときの処理は自分で適当に用意しろや

なんて答えるのがまともな人間。

「Rubyに2次元配列は存在しない(ドヤっ」
414デフォルトの名無しさん:2011/06/25(土) 17:17:14.50
どうか宿題スレも誰か立ててください。
スレ名: Rubyの宿題教えてください。3限目
↓テンプレ1
--
あなたが解けないRuby言語の宿題を片付けもらうスレッドです。気に入らない質問やその他や発言はスルーの方向で。

前スレ
http://hibari.2ch.net/test/read.cgi/tech/1200175247/

【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
 [3.1] OS: (Windows/Linux/等々)
 [3.2] バージョン: (Ruby 1.8.6 等)
 [3.3] 言語: (Ruby/JRuby/IronRubyどちらでも可 等)
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
415414:2011/06/25(土) 17:18:15.93
テンプレ2
--
【質問者へ】
回答者の便宜のため、質問の際は以下を行うことを推奨します。
・質問は【質問テンプレ】を利用してください。
・問題文は、出題されたまま全文を書いてください。
・問題文やコードをリンクするときは、一言内容にについて説明をつけましょう。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して投稿すると、
 その文字列を知らない他人に騙られることを防ぐことができます。

Ruby Home Page
http://www.ruby-lang.org/ja/
Ruby 初心者スレッド Part 44
http://hibari.2ch.net/test/read.cgi/tech/1307845568/
Rubyについて Part 44
http://hibari.2ch.net/test/read.cgi/tech/1308977168/
【RoR】Ruby on Rails Part11
http://hibari.2ch.net/test/read.cgi/php/1292032736/
416409:2011/06/25(土) 17:30:14.93
>>412
なんてお礼を言ったらいいかわかりませんが、できました。
3日間ぐらい、いじくり倒してできなくて泣きそうだったので、感激です。
大変ありがとうございます。
require 'rubygems'といれることにまったく気づきませんでした。
417デフォルトの名無しさん:2011/06/25(土) 17:34:39.57
いっそのこと配列添え字を文字列にしてハッシュテーブルに値ぶっこんどけばいんじゃね
418デフォルトの名無しさん:2011/06/25(土) 17:40:27.19
最近の学校ではRubyの宿題なんて出るのか
センター試験の数学でもRuby選択できるようになるのかな?
419デフォルトの名無しさん:2011/06/25(土) 18:03:47.88
webページの文字コードを調べる方法ってありますでしょうか?
http://table.yahoo.co.jp/t?s=998407.O&g=d
ここなんですが、UTF-8やShift-JISでテキストを抽出すると日本語が文字化けしてしまいます。
420デフォルトの名無しさん:2011/06/25(土) 18:16:46.22
>>419
EUC_JPならどうだろう?
421デフォルトの名無しさん:2011/06/25(土) 18:23:58.28
>>419
>>420も書いてるがhttpレスポンスのヘッダーにeuc-jpて書いてあったよん
422デフォルトの名無しさん:2011/06/25(土) 18:35:30.37
>>420 >>421
ありがとうございます。ソースのvalueの部分でEUC_JPを確認できました。
しかしながら、うまくできませんでした。

require 'rubygems'
require 'open-uri'
require 'nokogiri'
require "kconv"

#! ruby -Ke

doc = Nokogiri::HTML(open(
"http://table.yahoo.co.jp/t?s=998407.O&g=d"),nil,"euc")
doc.css("title").each do |title|
puts (Kconv.toeuc (title.text))
end

と書いていますが、文字化けしてしまいます。EUC_JPの記述あっていますでしょうか?
423422:2011/06/25(土) 21:35:23.37
違うやり方探してみます。
424デフォルトの名無しさん:2011/06/25(土) 21:38:53.66
>>422
urlの行 "euc" => "EUC-JP"

ruby -Keの行があるけど1.8系をLinuxとかで使ってるの?
425422:2011/06/25(土) 23:22:26.94
>>424
ありがとうございます。下記コードで無事日本語表示できました。
win7のコマンドプロプント使っています。
ruby -KeはEUC−JPの頭文字eを付けてみたのですが、関係ないみたいですね。
紛らわしくて申し訳ないです。
あとwin7のコマンドプロプントはJISなのでputs(Kconv.tosjis(title.text))にしないと
いけないみたいですね。助かりました。


require 'rubygems'
require 'open-uri'
require 'nokogiri'
require "kconv"

#! ruby -Ku

doc = Nokogiri::HTML(open(
"http://table.yahoo.co.jp/t?s=998407.O&g=d"),nil,"EUC-JP")
doc.css("td>small").each do |title|
puts(Kconv.tosjis(title.text))
end
426デフォルトの名無しさん:2011/06/26(日) 00:09:50.00
>>425
重箱だけど
#! の行はファイル先頭に書くのがお作法、その書き方だとただのコメント行として扱われる
あとruby1.9から -K オプションは非推奨

ついでにJISって書くと7bitJIS(ISO-2022-JP)みたい…
SJISとかShift_JISとか(厳密にはWindowsの場合Windows-31J)ね
427デフォルトの名無しさん:2011/06/26(日) 06:04:05.95
1.9なら
# coding:utf-8
を先頭に書くのおすすめ
428デフォルトの名無しさん:2011/06/26(日) 09:25:13.73
同じ人だと思うんだけど、なんでIOオブジェクトなんかを渡そうとするんだろう
文字列を渡したほうが安心確実高利回りなのに
429デフォルトの名無しさん:2011/06/26(日) 09:56:50.06
逆じゃないのかぬ
430デフォルトの名無しさん:2011/06/26(日) 10:50:13.02
メモリが許すなら、文字列として全部をreadしてから渡すのがいちばん無難で汎用的

内部でgetsとかで一行づつまたは数キロバイトずつ処理してくれることがわかっているなら、
Fileオブジェクトを渡すというオプションがあってもいい

Nokogiriはそんなことしないので、open(uri).read したものをぶんなげたほうが話が早い

っていうか、Fileオブジェクトがどんな文字列返すのか「不安」にならない? あとエラーとか
多少メモリを占有しても、文字列としてエンコーディングとかサイズとか確定させてから渡したいなあ
431デフォルトの名無しさん:2011/06/26(日) 10:59:06.49
ファイルポインタと勘違いしているに手持ちの掛け金全部
C厨はもうほんとに害悪しか撒き散らかさないから困る
432デフォルトの名無しさん:2011/06/26(日) 11:04:09.94
>>431
Rubyのファイルオブジェクトをファイルポインタと勘違いしてると
どんな問題が出てくるの?詳しくお願い
433デフォルトの名無しさん:2011/06/26(日) 11:07:29.63
>>432
ファイルポインタではないものをファイルポインタと呼んではならない
434デフォルトの名無しさん:2011/06/26(日) 11:20:46.13
nokogiriのドキュメントに書いてある通りに使って文句言うとかないわ
435デフォルトの名無しさん:2011/06/26(日) 11:25:14.88
そもそも Ruby 上にはポインタないしな…
ファイル読み込み開始位置子は別途 File オブジェクトの中に変数として保持されてる

てゆーか、なんか「Ruby はあなたの知っている○○言語ではない」というだけのことをなんか妙に拒否してるっぽい人が前からなんか
言語が違うんだから呼び名も概念も考え方も違うというのはあんまりに当たり前のことだと思うんだけど、そんなに難しいかな
436デフォルトの名無しさん:2011/06/26(日) 11:29:55.68
世の中結構多いけどね。
最初に学んだ枠組ベースでなんでもかんでも押し通す奴。
437デフォルトの名無しさん:2011/06/26(日) 11:29:56.30
>>433
いやそういうことじゃなくて、
Cのファイルポインタと同じ感覚で使ったら事故ったとか
そういう実例があるのなら聞きたかったんだけど

自分は常にファイルオブジェクトって呼んでるよ
438デフォルトの名無しさん:2011/06/26(日) 11:48:13.65
そういえば文字列かファイル風オブジェクトを受け取るパーサは
文字列を受け取った場合にStringIOでくるんでからパースしてることがよくある
(read, seekが使えるのと読み込み位置を記憶してくれて都合がいいから)
そういう場合も考えると文字列渡しとけってのが良い方法なのかは疑問
439デフォルトの名無しさん:2011/06/26(日) 11:51:58.24
動作とか利点とか明記したマニュアル書きましょうというお話だな
引数オブジェクトが read 可能だった場合は read して文字列にします、というだけじゃちょっと
440デフォルトの名無しさん:2011/06/26(日) 12:10:00.87
>>428

>>344とは別人です
441デフォルトの名無しさん:2011/06/26(日) 12:10:16.46
csv.foreachとかcsv.openとか使うと
csvファイルの1行目から順に読んでいくみたいなんですが、

最後の1行だけ読みたい場合はどうしたらいいでしょうか?

すごく初歩的な質問ですいません。
ぐぐっても出てこなくて・・・
442デフォルトの名無しさん:2011/06/26(日) 12:20:12.66
IOオブジェクトがopenされている期間は短いほど好ましいと感じてるので、
許されるなら自前でopenしてreadしてcloseした結果の文字列(正しいエンコーディング情報つき)を渡したい今日この頃
文字列をどう処理するのかにもよるから(先頭からエンコーディング確定で順にパースできるなら文字列は二度手間)、
やっぱ詳細をマニュアルに書いて欲しいのは確か

>>441
できません

ああ、またこんな言い方したらネチネチ言う人が出るかな
ファイル全体を一度読んで、最後の行を探さないといけないので、そういう魔法みたいな「軽い」単機能はない
がりっと全部単なる文字列として読み込んでから改行で区切った最後の行をCSVとして解釈したり、
全部をCSVとしてパースし終わってから、最後の行に相当するデータを抜き出したりしてくだち

それこそやろうと思えば適当なファイル位置から最後まで読んで探すこともできそうだけど、そんな回答を望んでるわけじゃないよね
443デフォルトの名無しさん:2011/06/26(日) 12:29:19.76
シェルで tail コマンドが使えるなら一発だ
444デフォルトの名無しさん:2011/06/26(日) 13:35:33.94
>>442
ありがとうございます。時間食いそうだけど、全部読むしかなさそうです
そもそもデータをcsvで保存したのが間違いな気がしてきました

>>422
自分と同じ道通ってる人がいるみたいですね
445デフォルトの名無しさん:2011/06/26(日) 13:58:07.34
あ、大きなファイルである場合は、seekでファイル読み込み開始位置をすっごい後ろに指定してバイト列読んで最終行探してもワリに合うことがあるよ

>>443のtailがいちばん手軽だけど
Windowsなら仕方がないかな
446デフォルトの名無しさん:2011/06/26(日) 14:05:07.97
CSVは、最後の行だけで最後のレコードを構成できるとは限らんしなぁ。
447デフォルトの名無しさん:2011/06/26(日) 14:09:44.25
汎用では無理だが、どんなデータ入ってるか事前に決め打ちできる場合はなんとでもなる
448デフォルトの名無しさん:2011/06/26(日) 14:19:10.18
どでかいファイルならファイルのケツからシークして改行さがす
小さいファイルなら一気に読み込んで文字列操作でケツを探す、ってところじゃね

ダブルクォーテーションで要素(?)を囲うのがありな場合は
ちょいと面倒そうだな
449441:2011/06/26(日) 14:46:59.44
みなさんありがとうございます
csvデータの中身は株価データで
年   月   日   
1983 1 4 144 144 140 141 309000 141
1983 1 5 144 155 142 153 2416000 153
1983 1 6 162 168 157 160 7245000 160
                  ・
                  ・
2011 6 8 168 169 167 168 46000 168
2011 6 9 171 173 171 172 291000 172
2011 6 10 177 178 174 175 504000 175
って感じになってます
行数は少ないので1000行多いので7200行ってとこです

最終行の日付読んで
2011/6/11〜今日まで
のデータをスクレイピングしてデータに追加するプログラム作るのに

最終行の日付け読む必要があるんですが、
シークして改行探すのがよさげなかんじですかね?
450デフォルトの名無しさん:2011/06/26(日) 14:47:59.54
PHPだと$file=file(csvファイルのパス);echo end($file);と簡単に出来るんだけどな
451デフォルトの名無しさん:2011/06/26(日) 14:53:06.07
高度な釣りだな
452デフォルトの名無しさん:2011/06/26(日) 14:53:09.12
>>450
それ相当でいいのなら File.read(csv).lines[0] で済むような。
453デフォルトの名無しさん:2011/06/26(日) 14:53:26.71
ぜろじゃねぇ。-1
454デフォルトの名無しさん:2011/06/26(日) 14:59:23.22
File.open(csv).reverse_each.first とか?
455441:2011/06/26(日) 15:04:03.26
あ、あっさりいけた・・・みなさんありがとうございます
なんでこれに1時間悩んでたんだろう・・・orz

また、つまづいたらお願いします
456450:2011/06/26(日) 15:20:29.42
>>455
いいってことよ
457デフォルトの名無しさん:2011/06/26(日) 16:19:21.59
lines(Enumerator)には[]ないな。
458デフォルトの名無しさん:2011/06/27(月) 07:00:24.51
なんとなく1.8の頃に書いたコードを1.9で動かしてみたら
Stringのエンコーディング不一致でほぼ全滅・・・

しかも1.9に対応させると今度は1.8で動かないし('A`)
459デフォルトの名無しさん:2011/06/27(月) 07:36:43.43
python最強
460デフォルトの名無しさん:2011/06/27(月) 08:04:45.02
こんな短いやりとりでRubyはおろかPythonも使ったことがないということが露見するという
たいへん心温まる出来事でした
461デフォルトの名無しさん:2011/06/27(月) 08:13:19.81
まあ、この文脈ではPythonに優位性は特にないな…

>>458
キャラクターエンコーディングに対する理解と実行が不足な状態だった可能性がある
1.9でわかったんだからいいじゃないか
462デフォルトの名無しさん:2011/06/27(月) 17:18:34.42
このスレには、お世話になっております。ありがとうございます。
463デフォルトの名無しさん:2011/06/27(月) 17:33:33.04
rubyでnokogiriを使ってスクレイピングするには、cssとXPathについて勉強が必要だと
感じましたが、他にこれを勉強すれば、スクレイピングに便利、役に立つっていうようなものなどは
ありますでしょうか?
464デフォルトの名無しさん:2011/06/27(月) 17:37:07.79
正直とにかく何かやってみるほうが先だと思う。

つまづくところは多分処理する対象によってぜんぜん違う。
465デフォルトの名無しさん:2011/06/27(月) 17:48:56.26
ありがとうございます。手当たりしだいやってみます。
466デフォルトの名無しさん:2011/06/27(月) 20:21:12.05
最近スクレイピングネタが多いがみんな何やってんだ?
467デフォルトの名無しさん:2011/06/27(月) 20:24:14.00
いや別に多くはないだろ
468デフォルトの名無しさん:2011/06/27(月) 20:30:49.56
2ちゃんボットでも作ってるじゃないの?
自分の代わりに低能な質問を自動投稿する人工無脳。
469デフォルトの名無しさん:2011/06/27(月) 20:55:52.65
>>468
HTMLのパースなんて一切必要ないということがわからないなんて可哀相
470デフォルトの名無しさん:2011/06/27(月) 23:25:14.74
>>461
そもそも1.8以前にそんな概念はないだろ。何を言っているんだ?
471デフォルトの名無しさん:2011/06/27(月) 23:45:56.06
Ruby1.8以前にはこの世にキャラクターエンコーディングなんて概念はなかったらしい。
それどこの宇宙?
472デフォルトの名無しさん:2011/06/27(月) 23:48:54.01
Ruby1.8のStringにキャラクターエンコーディングの概念があった記憶はないなぁ・・・
473デフォルトの名無しさん:2011/06/27(月) 23:51:26.77
Stringオブジェクトの属性としては、ね。

それが文字列である以上何らかのキャラクターエンコーディングではあったわけで。
474デフォルトの名無しさん:2011/06/28(火) 00:14:37.92
python最強
475デフォルトの名無しさん:2011/06/28(火) 00:32:21.96
1.9はエンコーディング周りでバグバグのままスタートしたのが悪かった
どこが悪くてエラーが出るのか判断すごい難しかった
476デフォルトの名無しさん:2011/06/28(火) 00:54:35.29
477デフォルトの名無しさん:2011/06/28(火) 03:13:24.64
元々国際化の実装を回避してリリースしてたのが不味かった。
実際に現場で使われるほどに、日本語環境で問題出まくり出しな。

結局perlと同じ後追いで国際化に取り組む羽目になった。java見たいに内部utf8って決めうちしちゃったほうが楽に乗り切れたと思うよ。
478デフォルトの名無しさん:2011/06/28(火) 03:14:58.89
へ―日本生まれだから日本語関係の実装は問題なく開発されてきたのだと思ってた。
479デフォルトの名無しさん:2011/06/28(火) 03:21:13.31
内部コードをUTF-8にするのが自然なアプリケーション以外を見捨てるのが楽ならね。
480デフォルトの名無しさん:2011/06/28(火) 04:33:10.38
>>477
>元々国際化の実装を回避してリリースしてたのが不味かった。
>実際に現場で使われるほどに、日本語環境で問題出まくり出しな。

具体的にどんな問題があったの?
詳細が知りたいので、リンクがあればおしえて。
ぐぐってみた感じではみつからないなあ。
481デフォルトの名無しさん:2011/06/28(火) 05:19:45.69
ここでバグ報告してどうする
482デフォルトの名無しさん:2011/06/28(火) 06:22:35.62
>>479
他の文字エンコーディングからUTF-8に変換するコストが割に合わないのが一因ではあったな
Shift_JIS→内部UTF-8→Shift_JISで文字が欠落するとか、それこそ日本人用としてはありえない
だったらShift_JISのバイナリ文字列として終始扱ったほうがまだマシ

っていうか、Windowsで使える日本語文字はUTF-8ですべて表現できるとか思ってる人がいるっぽい
表現できないぞ
規格上は表現できるはずだったが、ゲートウェイである変換の実際の実装がみんなバラバラで問題が
世の中そんなもんだよね
483デフォルトの名無しさん:2011/06/28(火) 06:48:50.78
別に出まくりではないな
出まくりだとしたら、たとえば常態1.8なRailsでも出まくりだということになる
でもそんな話はあまり聞かない

>>480
一応、$KCODEがシステムグローバルであるという問題はメジャーではあった
UTF-8で日本語書いたライブラリと、
Shift_JISで日本語書いたライブラリと、
EUC-JPで日本語書いたライブラリをrequireするとうまく動かない

日本語ならまだしも、なんか適当にラテン文字が書いてあるライブラリなんかだと…

あと、外人さんがライブラリ内部でやたらめったら$KCODE='u'しまくってるという問題も

$KCODE = 's'
require '外人さんライブラリ'
p $KCODE #=> 'u'

みたいなめんどくさいことが昔は(今も)時々ある
484デフォルトの名無しさん:2011/06/28(火) 06:49:56.03
485デフォルトの名無しさん:2011/06/28(火) 07:46:57.18
>>482
それってRubyの問題じゃないじゃん
文字コード変換にまつわる数々の問題は
どの言語でも起きるわけだし
486デフォルトの名無しさん:2011/06/28(火) 08:05:57.40
>>485
だから、そういう相互変換の問題が身近だったからこそ、1.8も1.9も「内部でUTF-8決め打ち」にしなかったのだろ
487デフォルトの名無しさん:2011/06/28(火) 08:09:29.57
理想が高かった分移行がしんどいのはあると思うわ
488デフォルトの名無しさん:2011/06/28(火) 08:55:19.52
UTF-8 統一でいいじゃん、という想像力の低い人にとっては、無駄なことを
やってるように見える、というのが全てだろ。
489デフォルトの名無しさん:2011/06/28(火) 08:59:48.90
さっきからUnicodeをUTF-8と呼び続けているのは
釣りかなにかか
490デフォルトの名無しさん:2011/06/28(火) 09:01:27.60
メリケン共にとっては無駄なことをやっている、が全て
491デフォルトの名無しさん:2011/06/28(火) 09:08:10.32
じゃばこの内部表現は16ビットで1文字(キリッの、ほら、なんつったっけ、であって
UTF-8ではないよね。
492デフォルトの名無しさん:2011/06/28(火) 10:37:14.96
まず訂正。
×バカなアメ公
○バカなイタ公
クソコードを投稿(正確にはsvnリポジトリーにコミット)してたのは、イタリア人でした。
でもコードを管理してるコミュニティの親分はアメリカ人で、そいつのチェックでOKが出た上で投稿されたんです。

コードというのは、javaで書かれたプログラムコードのことで、テキストのエンコードのことではありません。
話が長くなるのでアレですが・・・
javaでは内部的に文字列をユニコードで処理しています。1文字は16ビットです。
Windowsも皆さんご存知の通り、内部的に文字列をユニコードで処理しています。1文字16ビットです。
Win32APIの末尾に w が付くやつがそうですね。
つまり、javaで何も考えずにフツーにプログラミングすれば、アメ公が作ってもイタ公が作っても
自動的に日本語対応になるんです。
あとは画面に表示されるメッセージを言語別に作成して、利用者の言語にあわせて切り替える仕組み
にしてやれば、マルチリンガルなアプリケーションの一丁あがり!ってワケです。
javaにはもともと、そういう仕組みが用意されてるので簡単です。
ところが、件のバカなイタ公は、文字列を一旦 UTF-8 にエンコードしてから表示しようとするんです。
もちろん文字化けします。バカなイタ公はなぜ文字化けするのか理解できないので
今度はそのUTF-8エンコードされた文字を、javaからWin32APIのWriteConsoleWに渡そうとします。
もちろん文字化けします。バカなイタ公はなぜ文字化けするのか理解できないので
今度はコンソールのコードページを無理やりUTF-8に変更するAPIを使いドツボにハマっています。
何もしなくていい、ただ System.out.println()関数でフツーに表示すればいい、ってのが理解できんのです。

アプリケーションをユニコード対応して国際化したい一心で一生懸命がんばってくれてるキモチはアリガタイwのですがw
ユニコードとUTF-8の違いが理解できてないため、まったくトンチンカンなプログラムコードを書いて投稿します。

このイタ公を何とかして退治したいです。イタ公の愚行をやめさせるナイスな文章を教えてください。
コミュニティは英語以外禁止なので英語で構いません。
493デフォルトの名無しさん:2011/06/28(火) 10:55:38.82
>>489
Unicodeの話は特にしてないと思うが
494デフォルトの名無しさん:2011/06/28(火) 11:15:20.00
Unicode==UTF-8 なんでしょ、彼の脳内では。
CCSもエンコーディングもUCSも知りませーん、ていう。
495デフォルトの名無しさん:2011/06/28(火) 11:16:29.63
1.9はいろんなエンコーディング扱えるようにしたが、問題が起こらないようにutf8にしとかないとダメだなという感じ
さらにライブラリ中でエラーが出ないようにforce_encodingしまくりで、カオス状態
496デフォルトの名無しさん:2011/06/28(火) 11:17:47.17
Windows Ruby1.9系

ファイルの文字コードがShift_JISで、取得するページがUTF-8だった場合
ファイルの文字コードがShift_JISで、取得するページがEUC-JPだった場合
ファイルの文字コードがShift_JISで、取得するページがShift_JISだった場合

ファイルの文字コードがEUC-JPで、取得するページがUTF-8だった場合
ファイルの文字コードがEUC-JPで、取得するページがEUC-JPだった場合
ファイルの文字コードがEUC-JPで、取得するページがShift_JISだった場合

ファイルの文字コードがUTF-8で、取得するページがUTF-8だった場合
ファイルの文字コードがUTF-8で、取得するページがEUC-JPだった場合
ファイルの文字コードがUTF-8で、取得するページがShift_JISだった場合

それぞれ先頭に「# coding: 各ファイルの文字コード」を入れる以外にどのようなことwおするべきですか?
497デフォルトの名無しさん:2011/06/28(火) 11:18:34.96
utf-8決め打ちにしなくてもいいけど、デフォルトはutf-8にしてほしかったな
coding〜とか全部に書くの面倒なんだが
utf-8がデフォルトだと海外でひんしゅく買ったりするのだろうか
498デフォルトの名無しさん:2011/06/28(火) 11:29:39.86
>>496
>取得するページ
ネットワークのソケットの IO はローカルのファイルの IO とは違って
常に ASCII_8BIT 固定で取り込むのが普通なのでどうでもいい
取り込んだあとに普通に文字列として必要なだけ変換しろ
499デフォルトの名無しさん:2011/06/28(火) 11:32:41.52
あれ、gem のバージョン指定の ~ って使えなくなったんだっけ?
500デフォルトの名無しさん:2011/06/28(火) 11:55:35.99
なんかなくなるという話を昔聞いたような、別の話だったような

そもそもなんか全然直感的じゃないよねあれ
501デフォルトの名無しさん:2011/06/28(火) 12:00:44.73
>>469
なぜ、HTMLのパースは一切必要ないのでしょうか?

スクレイピングで株のバックテストツールなどシストレに使おうともっています。
502デフォルトの名無しさん:2011/06/28(火) 12:28:19.33
>>491
> じゃばこの内部表現は16ビットで1文字(キリッの、ほら、なんつったっけ、であって
> UTF-8ではないよね。
重箱の隅だが最小単位が2オクテットってだけで
一文字が2オクテットというわけではないな。
503デフォルトの名無しさん:2011/06/28(火) 12:31:50.18
>>494
まあなんでCSIが下火になったかは
Rubyの惨状がわかりやすく示しているというか
504デフォルトの名無しさん:2011/06/28(火) 12:57:06.10
>>501
2chはHTML読む必要ないからだろ
datとbbs.cgiとエラーのときの変なページだけ正規表現で読めればいいんだし
505デフォルトの名無しさん:2011/06/28(火) 13:07:46.20
何故ASCII_8BIT 固定で取得するのですか?
506デフォルトの名無しさん:2011/06/28(火) 13:14:28.23
なんていうか、そもそものアレとして open-uri のメタファは 1.9 で破綻したと思う
uri-read とかいうライブラリ名で再出発するといいと思うよ
507デフォルトの名無しさん:2011/06/28(火) 14:23:57.93
>>503 世の中にはバカのほうが圧倒的に多いというただの事実がどうかしたか?
508デフォルトの名無しさん:2011/06/28(火) 14:36:40.46
隔離スレ立ってるぞ

Rubyについて Part 44
http://hibari.2ch.net/test/read.cgi/tech/1308977168/
509デフォルトの名無しさん:2011/06/28(火) 15:08:35.47
>>507
と、いうことにしたいのですね?
510デフォルトの名無しさん:2011/06/28(火) 15:27:10.78
むしろ世の中馬鹿ばっかりであることを知りながら
流れにわざわざ逆らって案の定痛い目を見た
「お利口さん」に対する批判というか自虐レスなのでは
511デフォルトの名無しさん:2011/06/28(火) 15:30:04.83
もう何が何だか
512デフォルトの名無しさん:2011/06/28(火) 15:45:22.97
>>504
2chではということでしたか、ありがとうございます。
513デフォルトの名無しさん:2011/06/28(火) 16:15:04.31
こんなとこで嫌み言い合ってないで
MLでやれっていう
514デフォルトの名無しさん:2011/06/28(火) 16:56:53.94
2011年現在、cgiってperlとrubyどっちが主流ですか?
515デフォルトの名無しさん:2011/06/28(火) 17:09:44.35
CGI自体今あんまり流行ってないというか
過去CGIで無理しまくってたのが各技術に散逸したという経緯があって
それで流行を言うのもあれなのだが、とりあえず回答としては常にperl
Rubyは公開CGIとかはあんまり得意ではない
516デフォルトの名無しさん:2011/06/28(火) 17:22:20.72
どんだけリソース使っても我慢できるローカルエリアなCGI(家庭内とか職場内とか)ならいいんだけどねえ
「有料」なサーバで、できる限り多くの人にサービスを提供することが目的のCGIとかは効率あまりよくないわ

「それでもRubyで作ってあることに意味がある」という信念なり差し引きプラスの何かがあるのでない限り普通はお勧めしない
PHPとかで作っとけ
Rubyでの経験があれば、それなりなものが作れるはずだ
517デフォルトの名無しさん:2011/06/28(火) 17:27:53.97
アホな書き込みだな
518デフォルトの名無しさん:2011/06/28(火) 20:09:59.07
多言語対応は結構なことだが
1.8用のコードをほぼ全滅させるような実装はなんとかして欲しい
force_encodingを書きまくらないと動かない
エンコーディングの判定なんてユーザーに任せればいいだろ
519デフォルトの名無しさん:2011/06/28(火) 20:15:55.08
「書きまくる」必要は本当はない
エラー出る部分だけ対症療法するなら、エラーの数だけ書かなければならないがね
520デフォルトの名無しさん:2011/06/28(火) 20:16:30.60
rubyは文字コード関係は弱いね
PHPは強いし文字コードで悩むことがほぼない
521デフォルトの名無しさん:2011/06/28(火) 20:26:09.57
1.9で作ってから1.8用に書き変えると文字列に関する変更点が極小になる
1.8は適当でも動くので、逆にすると悲惨
522デフォルトの名無しさん:2011/06/28(火) 20:29:54.61
1.9は本来の意図通り実装出来てればより簡単になる予定だったはず
523デフォルトの名無しさん:2011/06/28(火) 20:31:59.18
…まあ、意外と面倒だったんだから仕方あるまい
524デフォルトの名無しさん:2011/06/28(火) 20:35:05.66
1.8 使ったことないよ
525デフォルトの名無しさん:2011/06/28(火) 20:36:28.45
現状では1.8を捨てられない以上1.9はお遊びでしか使えないな
526デフォルトの名無しさん:2011/06/28(火) 20:52:01.05
過去の遺産のある人が何で初心者スレにいるの?
527デフォルトの名無しさん:2011/06/28(火) 20:55:55.35
必死だから
528デフォルトの名無しさん:2011/06/28(火) 21:01:10.13
じゃあ初心者に1.9を勧めればいいのか?
529デフォルトの名無しさん:2011/06/28(火) 21:05:05.32
とりあえずIOにエンコードの変換オプション渡せないの修正しとくように誰か言っといてよ
早く直しとかないと、アホみたいにASCII_8BIT多用するコードが増え続けるぞ
530デフォルトの名無しさん:2011/06/28(火) 21:14:22.90
お前のマシンにはredmine.ruby-lang.orgにアクセスできない呪いでもかかってるのか?
531デフォルトの名無しさん:2011/06/28(火) 21:19:09.05
encodeに関してはデフォルトの動作を変えちゃっていいと思うけどな
チェックする必要のある人は結局そのためのコード書くわけだし
532デフォルトの名無しさん:2011/06/28(火) 22:04:47.85
今年からRuby始めてここでお世話になってる初心者だけど1.8なんて使う気になれない
533デフォルトの名無しさん:2011/06/28(火) 22:32:58.72
1.8系使いたくはないけれど、redmine動かすために入れとかなきゃいけない
534デフォルトの名無しさん:2011/06/28(火) 23:14:34.68
初心者は1.87だと思ってましたが1、早やいうちに1.9系に変えた方がいいでしょうか?
535デフォルトの名無しさん:2011/06/28(火) 23:22:07.17
うむ
536デフォルトの名無しさん:2011/06/28(火) 23:24:48.83
>>534
1.8.7でも別にいいよ

1.9が使われてるのでわけがわからなくて困った、というようなことになる可能性は、すくなくとも今年はゼロだろう
来年もたぶん無い
再来年は若干怪しいかもしれないが、1年も使ってたら自力で使いどころの判断くらいできるようになってるはず
537デフォルトの名無しさん:2011/06/28(火) 23:32:20.37
ありあがとうございます。今年は1.87でいきます。
538デフォルトの名無しさん:2011/06/28(火) 23:32:30.40
まああれだ、来年の自分の伸びしろを信じろ、みたいなそんな感じだなw
1.9.xに関しては、必須も必死もいらない

ああ、公開ライブラリ作者にとっては(やっと)必須になってるんだが、まあその程度だ
ライブラリ公開できるようなときになってから、1週間くらいだーっと勉強すればいい
それ以前の中途半端なRuby知識で1.9対応を開始するとなんかもう果てしないドロ沼にハマるので注意
539デフォルトの名無しさん:2011/06/28(火) 23:37:16.38
変なタイミングで変に知識仕入れて勉強すると1.9を嫌いになるよね
force_encoding使いまくり
540デフォルトの名無しさん:2011/06/28(火) 23:41:54.08
ライブラリが対応してないとどうにもならんし
541デフォルトの名無しさん:2011/06/28(火) 23:44:15.06
今の1.9の仕様だと、force_encodingしまくるのが正しいのだぞ
542デフォルトの名無しさん:2011/06/28(火) 23:52:42.09
初心者は puts "こにゃにゃちは" からだぞ。
1.8 も 1.9 も変らん
543デフォルトの名無しさん:2011/06/28(火) 23:58:06.78
invalid multibyte char (US-ASCII)
544デフォルトの名無しさん:2011/06/29(水) 00:08:47.77
force_encodingが必要なのは境界面だけだと思ったのだが…
545デフォルトの名無しさん:2011/06/29(水) 00:09:28.96
どうやればそのエラー出せるのよ?
546デフォルトの名無しさん:2011/06/29(水) 00:15:57.72
>>544
基本的にはそう
動作上も、バイナリそのままで単に名称を貼り変えるしかやることない

ただ…
ttp://www.google.com/search?q=%22force_encoding+Encoding%3A%3AASCII_8BIT%22
547デフォルトの名無しさん:2011/06/29(水) 00:23:27.23
>>544
その通りだが1.8以前に書かれたコードはそんな事は微塵も考えられていない
結果、エラーを出すところ全てでforce_encodingしまくるか、全て書き直すかの二択を迫られる
548デフォルトの名無しさん:2011/06/29(水) 00:40:16.57
初心者には過去の資産はない
業務で使うなら会社でレクチャーするでしょ?
549デフォルトの名無しさん:2011/06/29(水) 00:48:19.85
>>547
1.8でも「間違ってる」んだけどな、本当は
たまたま動作してたに過ぎん
550デフォルトの名無しさん:2011/06/29(水) 00:51:50.16
Windowsの初心者で、せいぜい Shift_JIS の CSV ファイルの加工するくらいが目的なら

常に文字コードを意識しろ
処理の都度かならずエンコードしろ

って言われても戸惑うだろうな
551デフォルトの名無しさん:2011/06/29(水) 01:11:31.59
文字コードまわりはプログラミング言語問わず文字コードまわりそれ自体がファッキン
552デフォルトの名無しさん:2011/06/29(水) 01:34:30.45
正規表現の文字コードも絡んで複雑怪奇
553デフォルトの名無しさん:2011/06/29(水) 01:36:06.98
>>549
残念ながら1.9自体がバグバグです
554デフォルトの名無しさん:2011/06/29(水) 02:20:59.35
内部コードが単一なら内から外、
外から内だけ意識すれば良いし
それら境界面をいじるような
ライブラリを用意する人達は
「わかってる」公算が高い。

今のRubyの場合ワーストケースだと
文字列を操作したり文字列を媒介して
自分が書いたわけではないRubyの
モジュールとやり取りする箇所全てで
境界面同様の意識をする必要があると。

そして文字列を読み書きするだけの
ライブラリ作者は先の人達に比べれば
「わかってない」公算が高い、と。

となればまあ、美しさを捨ててでも
内部コードを単一化を選んだ各種言語、
各種環境が多いのも当然だよね。

美しさより利用者への優しさを選んだってことで。
555uy ◆hi.ht/Isu2 :2011/06/29(水) 03:36:41.50
さっさとUTF128で統一しろ
556デフォルトの名無しさん:2011/06/29(水) 06:22:03.97
uyさんの登場を待っている人がアンチスレにいますよ
557uy ◆hi.ht/Isu2 :2011/06/29(水) 08:52:12.85
しつもんしたいです


module A
  class << self
    p nesting
  end
  module B
#    p nesting  # ←なんでnesting使えないの????????????????????????
  end
end

require "ostruct"
a = OpenStruct.new({ :x => 4 })

a.define_singleton_method :ss do
  p x  #  ローカル変数だか
  p y  #   メンバ変数だか判断できないんですけどォ?????????
end

a.ss
558デフォルトの名無しさん:2011/06/29(水) 09:05:24.01
最近降りて来ないんです
559デフォルトの名無しさん:2011/06/29(水) 09:27:17.83
a.ssの中でx=0とかやって混乱してればいいのに
560デフォルトの名無しさん:2011/06/29(水) 09:38:31.67
a.ssの中でassignとかうまいことを言う
561デフォルトの名無しさん:2011/06/29(水) 10:42:57.67
>>553 バグなら報告しろ
FUD なら黙れ
562デフォルトの名無しさん:2011/06/29(水) 11:53:24.15
自分はwindows7のコマンドプロプントをつかっているのですが
下記のようなコマンドを展開しようとすると

% tar zxf ruby-dbi-all-0.0.19.tar.gz

’%’は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

とでてうまくいきません。これはLinuxとかのコマンドなのかなと想像していますが
winのコマンドプロプントの場合はどのように記入したらよいでしょうか?
563デフォルトの名無しさん:2011/06/29(水) 12:00:09.20
インストール手順ががらっと変わってくるから
windows ruby-dbi でぐぐったほうがいいよ
564デフォルトの名無しさん:2011/06/29(水) 12:12:01.46
>>563
ありがとうございます。もう少しがんばってみます。
565デフォルトの名無しさん:2011/06/29(水) 13:01:46.08
システムに tar や gzip がインストールされてパスが通っているものと仮定して
そのファイルと同じディレクトリ内で入力するのは
tar zxf ruby-dbi-all-0.0.19.tar.gz
のみでおっけー。パーセント記号は不要
566天使 ◆KOAgYBL/Xg :2011/06/29(水) 14:09:37.33
a = (0..10).to_a
a.reject! do|m|
  m==3..m==8 # error
# !!(m==3..m==8)
end
p a

これで、 `block in <main>': bad value for range (ArgumentError)
ってエラーがでるんだけど、なんで?
!!(m==3..m==8) ← こうやってTRUEかFALSEにしておけば通るんだけどォ????
567天使 ◆KOAgYBL/Xg :2011/06/29(水) 15:47:24.03
a = { :x =>1 , :y => 55 }

puts :each1
a.each do |m| p m end # => [:x, 1] [:y, 55]
puts :each2
a.each do |k,v| print k," ",v,"\n" end # => x 1 y 55
puts :reject1
a.reject do |m| p m end # => :x :y # ← ッハァ!?
puts :reject2
a.reject do |k,v| print k," ",v,"\n" end # => x 1 y 55

どうして ↓ これで
a.reject do |m| p m end
# => [:x, 1] [:y, 55]   こうなってくれないの????????
eachやmapだけが例外なのォ?

一瞬、このeachはCじゃないとかけないタイプのイテレータか???????って思ったけど

module Enumerable
  def test &block
    if block.arity == 1
      for a   in self do yield a   end
    else
      for a,b in self do yield a,b end
    end
  end
end
a = { :x =>1 , :y => 55 }
a.test do |m| p m end
a.test do |m,n| p m,n end

普通にかけたんだけどォ??
568天使 ◆KOAgYBL/Xg :2011/06/29(水) 16:32:55.12
moduleにinitializeに該当するのってないの??
一応extendしたときにself.extendedはよばれるけど、所詮、特異メソッドだから
@k のスコープが違うんね、だから手動でinit用の関数呼ばなくちゃ
def b とかの中で使ってる @k の初期化が不可能なんですけどォ?????
つまり、
module A
  @k = 22
  class << self
    include nesting[1]
  end
  def self.a
    p @k # => 22
  end
  def b
    p @k # => 44
  end
  def init
    @k = 44
  end
  def self.extended mod
    mod.init
  end
  Object.new.extend(self).b
  self.a
end
puts
extend A
A.b # => 22
b  # => 44

つまり、
moduleで @k とか使っていた場合、A.b と extend後の b で、動作変わっちまうってことなんですけどォーーー???????????w
569天使 ◆KOAgYBL/Xg :2011/06/29(水) 16:55:26.86

a = [ [33] , [44] ]
p a.map(&:push)
#p a.map(&:push , 8) # error # ← 引数渡せないのは仕方のないことなの?
というかなんで、Procにしているの? かっこつけないでシンボルにしたらいいのに


module Enumerable
  def test *h
   method( h.shift ).call *h
  end
end

p a.test(:push,[55],5,55,5,5)


570天使 ◆KOAgYBL/Xg :2011/06/29(水) 16:59:51.95
shuusei

module Enumerable
  def test *h
    self.map do |m|
      m.method( h[0] ).call *h[1..-1]
    end
  end
end
571デフォルトの名無しさん:2011/06/29(水) 17:04:35.24
Ruby/DBIってインストールめんどくさいんだよな
572デフォルトの名無しさん:2011/06/29(水) 20:33:18.57
>>565
ありがとうございます。

とりあえずgemを通さずにダウンロードしたものから解凍して
dbiをインストールできました。
irb(main):001:0> require 'dbi'
=> true
となりましたが、その後 require'dbi' ファイルを実行すると

コンピュータにLIBMYSQL.dllがないため、プログラムを開始できません。
この問題を解決するには、プログラムを再インストールしてみてください。

と表示されます。自分のMYSQLが5.5なのが問題のようですが、みなさんは
rubyとDBはどんな組み合わせを使っていますでしょうか?

573デフォルトの名無しさん:2011/06/29(水) 20:42:42.32
SQLite でつ
574デフォルトの名無しさん:2011/06/29(水) 21:55:28.47
firebird
575デフォルトの名無しさん:2011/06/29(水) 23:08:45.18
Windowでしか使わないようなものは秀丸と秀丸メーラーと秀丸ファイラーとjane styleとかなので
WinからLinuxに環境を移行したいのですが
Linuxをやる上で覚えておいたほうが良い言語ってありますか?
576デフォルトの名無しさん:2011/06/29(水) 23:11:10.98
>>573、574
ありがとうございます。
SQLite使ってみます。
577デフォルトの名無しさん:2011/06/29(水) 23:20:45.78
>>575
Cとスクリプト言語ひとつ
あとなぜここで聞く
578デフォルトの名無しさん:2011/06/29(水) 23:31:52.57
ありがとうございます
ここのスレの先輩方はこの板で一番スキルがあると考えて聞いてしまいました
すいませんでした
579デフォルトの名無しさん:2011/06/30(木) 00:47:42.75
大事なものを忘れてる
英語の方が役に立つ
580uy:2011/06/30(木) 02:54:33.23
※ スキルが高いのは一人でほかは普通です

何かひとつの言語をやり続ければある程度にはなる
処理系のソースからライブラリのソースまで全て読む
もっと上が良いなら好き嫌いせずにすべての言語でそれをやれ
581デフォルトの名無しさん:2011/06/30(木) 12:24:34.44
botを作りたいのですが、gemがインストールできません
ダウンロードして
ruby setup.rb
してもエラーが出ます。gem -vで確認すると、ダウンロードしたものはバージョン1.8.5だったのに、何故か1.0.1と表示されます。
このまま
gem install twitter
としてもエラーが出ます
何故gemがインストールできないんでしょうか??
582581:2011/06/30(木) 12:32:13.03
ちなみにエラーはこんな感じです
ruby setup.rbした場合
./lib/rubygems.rb:334: warning: parenthesize argument(s) for future version
./lib/rubygems.rb:511: warning: parenthesize argument(s) for future version
./lib/rubygems/dependency_list.rb:8:in `require':
./lib/rubygems/deprecate.rb:53: syntax error, unexpected ',', expecting '|'
(SyntaxError)
... define_method name do |*args, &block| # TODO: really works ...
^
./lib/rubygems/deprecate.rb:54: syntax error, unexpected tCONSTANT,
expecting '}'
./lib/rubygems/deprecate.rb:63: syntax error, unexpected kEND, expecting '}'
./lib/rubygems/deprecate.rb:68: syntax error, unexpected kEND, expecting '}'
from ./lib/rubygems/dependency_list.rb:8
from ./lib/rubygems.rb:29:in `require'
from ./lib/rubygems.rb:29
from setup.rb:27:in `require'
from setup.rb:27
583デフォルトの名無しさん:2011/06/30(木) 13:12:36.54
1.9ならRubyGemsが組込まれてるから
gem update --system
でアップデートできるハズ
584デフォルトの名無しさん:2011/06/30(木) 13:29:23.11
あ、すいませんRubyは1.8.6です
確か初心者は1.9じゃない方がいいとあったので入れてないんですが、1.9にしないとダメですかね?
585デフォルトの名無しさん:2011/06/30(木) 13:33:11.93
cronjobが日本人を拒否した理由
botを作りすぎたから
586デフォルトの名無しさん:2011/06/30(木) 20:35:54.78
すでに過去のバージョンがインストールしてあると、gem は(上書き?)インストール
できなかった気がする。本家サイトにも 1.1 や 1.2 からのアップデートに不具合が
あると書いてあるし。自分は /usr/local/lib/ruby/ 以下にある gem 関係を手動で
削除してインストールしたけど、こればかりは環境によるだろうからお勧めできない。
587デフォルトの名無しさん:2011/06/30(木) 21:22:19.75
消す(というか他所にどかしておく)なら
lib/rubygems.rb と lib/rubygems ディレクトリ、
あと /path/to/bin/gem …は平気か。
588デフォルトの名無しさん:2011/06/30(木) 22:15:35.16
bin/gem も消しますた
589デフォルトの名無しさん:2011/07/01(金) 00:50:20.95
レンタルサーバでバージョンが固定されてるんでもなければ1.8.7使っとけ
590デフォルトの名無しさん:2011/07/01(金) 09:50:35.95
RubyでApacheのモジュールって作れないですよね?
591デフォルトの名無しさん:2011/07/01(金) 09:53:32.30
造ろうと思えば造れる
592デフォルトの名無しさん:2011/07/01(金) 10:19:21.82
まあ、作れない、でいいと思う
Rubyで作るということそれそのものを目的にするのでない限り、他の手段をとったほうがいい
593デフォルトの名無しさん:2011/07/01(金) 10:21:18.91
>>592
ほらほらそんなこというとまた出てくるよ
594デフォルトの名無しさん:2011/07/01(金) 10:56:28.04
>>592
あれ、mod_rubyは使えないの?
使ったことはないけど、ドキュメントを読む限りではmod_perlと同じ様にできそうだったけど。
595デフォルトの名無しさん:2011/07/01(金) 11:09:18.03
ずれてるけどあえて指摘しない
596デフォルトの名無しさん:2011/07/01(金) 12:34:17.70
初心者スレなんだから優しく
お・し・え・て・ょ
597デフォルトの名無しさん:2011/07/01(金) 12:39:38.46
947 デフォルトの名無しさん [sage] 2011/07/01(金) 12:31:19.28 ID: Be:
勢いが1月で終ってるから誰も来ないでしょ
きのこスレとか再利用すればいいよ

948 デフォルトの名無しさん [sage] 2011/07/01(金) 12:35:21.02 ID: Be:
つ 【オフサイドルール】プログラミング言語文法総合スレ【ダングリングエルス】
598天使 ◆uL5esZLBSE :2011/07/01(金) 13:16:07.07
日本発のオブジェクト指向言語Rubyでスクリプトかいてマ板とム板を荒らしたいんですけど
やっぱりクッキー偽装しても書き込み秒数制限の壁に当たります
IPの仕組み的に考えるとやっぱりこれは1PCで荒らすのは困難なことのでしょうか?
599デフォルトの名無しさん:2011/07/01(金) 13:24:03.65
http://code.google.com/apis/sketchup/のGoogle SketchUp Ruby API ってみなさん活用していらっしゃいますか?
600tensi:2011/07/01(金) 13:53:24.29
si
601デフォルトの名無しさん:2011/07/01(金) 13:54:08.60
SketchUpって物凄くひさしぶりに聞いた
まー、Google SketchUpを使ってる人でこれ使いたい人ってことでかなり限られるとは思う
602天使 ◆uL5esZLBSE :2011/07/01(金) 13:59:43.55
>>598
ここまでかいたので、誰かマ板ム板の荒らしに役立ててください ぼくは忙しいのでもういかないといけません
どなたぼくの意思を受け継いでもらえると うれしいかぎりです ろくな技術的話題も展開せず2chにたむろしてるゴミグラマたちに 制裁を 制裁を 天は許しても俺は決してお前たちを許さない
require 'rubygems'
require 'mechanize'
require 'kconv'
require 'pp'

for i in 0...1
  agent = Mechanize.new

  uri  = URI.parse("http://hibari.2ch.net/test/read.cgi/tech/1307845568/l5")
  uri2 = URI.parse("http://hibari.2ch.net/")

  agent.get(uri)

  str = "PON=softbank127001001001.bbtec.net"
  Mechanize::Cookie.parse(uri2, str){|c| agent.cookie_jar.add(uri, c)}
  str = "HAP=FOXdayo53616c7465645f5fdefa1063f4b590c067e8f3fd221e3bc2e769268f80854ab4922fa1f60a6afddd2" +
         "adcf2d018cec008177b9704cedd4d2572b79ae244c952b9d1db3a6ea323e1bb0676f649c68f67b6ced026e18acfcc"+
         "608072782896e68c77a704b0850071f817b68e3b940576e00324e9a3a22b99243384adbec76fddd203b862612934cf"+
         "bae4d7ebf686b3c84ffd7566ce20704469004110fe95ae782d0d"
  Mechanize::Cookie.parse(uri2, str){|c| agent.cookie_jar.add(uri, c)}

  agent.page.form_with(:name => nil) { |f|
    f.field_with(:name => "FROM").value =  "tensi"
    f.field_with(:name => "MESSAGE").value =  "si"
  }.click_button
  sleep 1
  agent.page.form_with(:name => nil).click_button
end
603デフォルトの名無しさん:2011/07/01(金) 15:50:05.43
>>602
リスクが怖いからって人にやらせようとすんなよヘタレ
604デフォルトの名無しさん:2011/07/01(金) 15:55:31.70
これ実行したらどうなりますか?
605デフォルトの名無しさん:2011/07/01(金) 15:57:56.42
>>604
APIなんだし、SketchUpを操作するんじゃね?
606天使 ◆uL5esZLBSE :2011/07/01(金) 16:20:04.69
>>603
ハァ?
どんな方法であれ他人のPCでやらせるのはあたりめーだろ
お前まさか アレ をやる時も自分PCから直接アクセスしてんの?wwwwwwwwwwwwップwwwwwwwwwwwwwwww
607デフォルトの名無しさん:2011/07/01(金) 17:31:20.27
このひとってうよってひととどういつじんぶつ?
608デフォルトの名無しさん:2011/07/01(金) 17:51:42.46
Rake のバージョンを Rakefile 中から参照するにはどうしたらいいですか
> rake/rdoctask is deprecated. Use rdoc/task instead
という警告をなくしたいんだけど、よく考えたら rdoc/task があるかどうかはクライアントの Rake のバージョン依存なのよね
609天使 ◆uL5esZLBSE :2011/07/01(金) 18:08:08.09
>>608
 こ れ す ら
出来ないんだな・・・・・・

a = `gem list rake`
a =~ /rake\s(.*)/
p $1.split(/,/)
610デフォルトの名無しさん:2011/07/01(金) 18:20:03.15
rdoc/task をまずは require してみて、ダメだったら(例外をrescueして)
rake/rdoctask を require かなぁ?
611デフォルトの名無しさん:2011/07/01(金) 18:32:01.17
天使=uy=Perl忍者
612デフォルトの名無しさん:2011/07/01(金) 18:35:20.38
>>610
えー

まあ、今回はそれでもいいんですが、そうしようかなあ
バージョン依存で困ったら、またそのとき考えよう
613デフォルトの名無しさん:2011/07/01(金) 18:47:48.67
あ、これ困ってたのよ

>よく考えたら rdoc/task があるかどうかは
RDoc gem がインストールされているかどうかだと思う
だから、今回は require で rescue するのが正しい

…のだが、改めて rake/rdoctask.rb を読むに、なんかとてもめんどくさいことになっている
Rails 厨向けの rake のバージョンを 0.8.x に下げろという台無しアドバイスは今回に限ってはわりと妥当だw

依存関係に RDoc を指定してしまうのが一番かもしれない
ユーザーにとっては迷惑だろうけど…
614デフォルトの名無しさん:2011/07/02(土) 10:12:58.82
>>607
どちらにせよ基地外なので同じでも違ってもどうでもいい
615デフォルトの名無しさん:2011/07/02(土) 16:35:36.13
社内用の小規模な Web アプリケーションを Ruby で開発しています。

rhtml や erb ファイルをステップ実行させながらデバッグできる
開発環境をご存じでしたら御教授下さい。

バックエンドの CGI に飛んでいる部分もありますが、
Rails は使用していません。

eclipse, NetBeans, Aptana Studio を試してみましたが、
うまく動かせませんでした。
(できればローカルの Apache Web Server 2.2 と連携させてデバッグ
させたいのですが、難しければデバッグ用に別のサーバを使う方法でも
構いません。)

よろしくお願いします。 m(_ _)m
616デフォルトの名無しさん:2011/07/02(土) 20:48:06.36
小規模でしかもWeb向けならステップ実行なんてしなくてよくね?
617デフォルトの名無しさん:2011/07/02(土) 21:02:59.87
なんかHTTP出力をこまめにflushする仕組みなかったっけ?
618デフォルトの名無しさん:2011/07/02(土) 21:26:08.36
rubyで2秒ごとに自動で更新できるようにしたいのですがどうしたら良いでしょうか?
619デフォルトの名無しさん:2011/07/02(土) 21:40:48.78
>>618
2秒ごとにスクリプトを呼ぶようにOSのスケジューラに登録する
間隔が2.05秒になったら家族が殺されるとかいうような場合はRubyスクリプトを終了させずにsleepさせておく

なんか前にも言った気がする
620デフォルトの名無しさん:2011/07/02(土) 21:53:55.80
>>35のへんから話が出てるな
621デフォルトの名無しさん:2011/07/03(日) 00:07:08.20
何のアプリなんだろう?
622デフォルトの名無しさん:2011/07/03(日) 05:08:23.97
Eclipse/NetBeansのステップ実行で「駄目」ということはつまり、
ブラウザ上の出力を止めて、ブラウザ上での送信を止めたいのだと思う
623615:2011/07/03(日) 12:10:21.31
次善策ではありますが、
rhtml や erb ファイルの代わりとなるドライバ CGI
ファイルを用意し、ARGV.replace(["val1=3&val2='hoge'])
などとして引数を渡すことでステップ実行させることにしました。
ありがとうございました。
624デフォルトの名無しさん:2011/07/03(日) 15:34:47.40
1.9.1
1.9.2
1.9.3
の違いが良くわからん。
これらはどういう関係なの?
625デフォルトの名無しさん:2011/07/03(日) 15:54:31.52
テンプレ読め

って書いてないのか
誰だ削ったの

1.9 系列は「記述に1.8との互換性がないと断言できそうな新しいRuby」だ
1.9.0 が不安定な永遠の開発版で、1.9.1 以降が安定板
数字が新しいほど新しく、現在は 1.9.2 が最新
1.9.3 は公開目指して調整中

1.8.x は旧系列で、1.8.6 が昔の安定板
これ以前のものは現在の不安定版に相当するので現在は使ってはいけないおい聞いてるかCentOS
1.9 のいくつかの便利で無難なメソッドを輸入した 1.8.7 が現在の 1.8 系列の最新版
完全初心者が 1.8.7 と 1.9.2 のどちらを最初に使うべきかというのは議論中だが(結論出る前に1.9が一般化してうやむやになる予定)、
とりあえず 1.8.7 ならあらゆるものがエラーなしに動くと思われる
626デフォルトの名無しさん:2011/07/03(日) 16:05:04.13
>>625
1.9.1、1.9.2、1.9.3は新しいか古いかの違いだと読み取れるけど、
それじゃあ、1.9.1と1.9.2にそれぞれパッチを当ててリリースしてるのはどうして?
何か機能的に違いがあるってことじゃないの?
627大天使 ◆uL5esZLBSE :2011/07/03(日) 16:16:05.55
今、マルチバイトのディレクトリ内でサーバー起動して、
index.htmlは動いたけどindex.cgiは動かなかった
しかもこれ、ディレクトリ名にマルチバイトがはいっていたら動かないのではなく
トップディレクトリがマルチバイト文字だと動かないらしい
下にsabaとかフォルダ作ればその上にあるのがマルチバイト文字のフォルダでも動く
Rubyってマルチバイト弱すぎだろ
それに何かインストールさせたい時にもディレクトリにマルチバイト混ざっていると動かないしさ
それってつまりFirefoxなんかの"デフォルト"のダウンロードしたファイルを保存する"ダウンロード"っていう名前のディレクトリに保存された
Rubyのライブラリや、Ruby本体のインストーラーが、ダブルクリックでは動かないって事だぞ
処理系内部で自動識別はいつになったらやるようになるの?
628デフォルトの名無しさん:2011/07/03(日) 16:26:00.20
自分でやれよゴミ天使
629デフォルトの名無しさん:2011/07/03(日) 16:33:00.14
いろいろと勘違いが凄すぎて何も指摘できない
630デフォルトの名無しさん:2011/07/03(日) 16:36:47.53
>>626
あるよ

1.9.0 というベースがあって、それが最初に固まったのが 1.9.1 で、1.9.2 が出た現在、これはバグフィックスだけが行なわれる
バージョンの後ろの p123 みたいな数字がパッチレベルで、これが大きいほど修正が施されてて新しくて安全
1.9.1 相当に細かい新機能というかあればよかった系の新メソッドをどさっと加えた状態で公開されたのが 1.9.2
1.9.3 は 1.9.2 相当に新機能足したものになる予定
だから「1.9.1 では動作したけど 1.9.2 では動作しない」というのは全くないというわけではない


…いや、はっきり言うと、1.9.2 はカレントディレクトリを LOAD_PATH に含まなくなったので非互換どころではなかったw
1.9.2 の動作のほうが「正しい」んだけど、こんな途中でするような手術ではないっていうか 1.9.1 でやっとけよみたいな

1.9.1 や 1.9.2 のバグ修正パッチサポートがいつまで続くのかは知らない
どっかに書いてあるとは思うんだけど…
631デフォルトの名無しさん:2011/07/03(日) 17:18:46.54
元々の扱いは開発版だったしな
正式版扱いになったのっていつ頃だっけ、その頃1.8と1.9ってバージョンいくつだったんだろ?
632デフォルトの名無しさん:2011/07/03(日) 17:35:49.02
1.9.1から正式に全て安定版ですが
1.8系列の安定板は1.8.6から
633デフォルトの名無しさん:2011/07/03(日) 17:48:06.46
あれ、そうだったっけ
んじゃあ真ん中の番号を偶数奇数で開発安定ってのをやめたのいつ頃だったっけ?
634デフォルトの名無しさん:2011/07/03(日) 18:00:34.69
1.9.1 のとき

本当は 1.9.1 は 1.9 系列つまり開発版の第 1リリースになるはずだった
でもそうすると 1.9 系列をもとにした安定版は 2.0 ということになってしまう
Ruby 2.0 という名称をまだ使いたくなかったので、1.9.0 を永遠の開発版にしたわけ
いきなりここでバージョン番号規則が捻じ曲がったから、当時はけっこう混乱した

まあ、今みたいに普及してしまえばどうということもないのだけど
1.8.8 が出たら 1.9.0 と近くなりすぎてめんどくさいことになるかもしれない
1.9.0 はそのへんに落ちてないから、問題は起こらないとは思うけどさ
635デフォルトの名無しさん:2011/07/03(日) 18:21:37.82
String.split()で¥(半角)で分割したいときってどう書けばよい?
636デフォルトの名無しさん:2011/07/03(日) 18:30:56.70
マニュアル読め的な何かだが、split は引数に正規表現をとることができる
なんか何故か世の中には頑なに文字列(しかも1文字)のサンプルが氾濫してるんだが

ということで split(/\\/)
637デフォルトの名無しさん:2011/07/03(日) 18:41:10.23
しまったこいつは ¥ だ! 俺が変換するからお前らは逃げろ!

split('¥') が正解
638デフォルトの名無しさん:2011/07/03(日) 18:50:51.54
¥の半角は¥である
うむ、間違いではないな
間違いではないのだが…

ふつーのバックスラッシュで分割したいなら>>636
特定文字の円記号で分割したいなら>>637
639635:2011/07/03(日) 18:53:58.40
>>636-638
出来たーありがとう!
640デフォルトの名無しさん:2011/07/03(日) 19:00:53.14
本来バックスラッシュなんだけど、場合によっては円記号になる
→ U+005C REVERSE SOLIDUS
円記号
→ U+00A5 YEN SIGN
641デフォルトの名無しさん:2011/07/03(日) 22:37:57.86
>>634
ありがと
642大天使 ◆uL5esZLBSE :2011/07/04(月) 03:47:38.86
>>628
はぁ?
これ す ら わからないときたか

>>629
他アプリの初期設定で動くようにしてない時点でゴミなわけだけど
しかもそれがマイナーブラウザならまだしもFirefox
643デフォルトの名無しさん:2011/07/04(月) 05:46:24.85
天使さん戻っておいでよ
644デフォルトの名無しさん:2011/07/04(月) 05:59:26.55
>>640
そういう話はしてない
¥の「半角」に相当するものがなにかという話だ
yen sign でよかろう
そして、たぶんそれは間違ってる
645大天使 ◆uL5esZLBSE :2011/07/04(月) 06:26:52.19
キーボード押した時にOSが何の画像を表示するかだろ
画像だよ結局、画像
splitが正規表現も使えるかどうかなんて、経験則
他のsubやgsub,scanも同じ事情なんだし、アホじゃなければそのうち気づくだろ
個人的には、それらの関数が//のかわりにStringでいいにもかかわらず
"aaa" =~ "a" これが通らないのが変だとは思ってる
646デフォルトの名無しさん:2011/07/04(月) 07:32:14.36
http://www.ruby-lang.org/ja/news/2011/07/02/ruby-1-8-7-p352-/
> 三年に渡るご愛顧ありがとうございました、1.8.7 はもうちょっとだけ続きます。

1.8.7っていつまでメンテされるの?
社内で使う場合にサポート期間とかを書かないと駄目なんでソースがあると嬉しいんですけど…。
647デフォルトの名無しさん:2011/07/04(月) 07:48:42.68
「もうちょっとだけ続くんじゃ」ってことはしばらくメンテするってことなんだろうけど、
実際のメンテナンスサイクル期間についての言及はなかったと思う

ゆぐいの記録するところによれば
ttp://yugui.jp/articles/801
> 2本のteenyブランチがメンテナンスされる。
> 今は1.8.6と1.8.7がメンテナンスされている。
> 1.8.5はもう放棄される予定だ。1.8.8が出たら、1.8.6はじきに放棄される。
ということなんだけど、1.8.6 はREEでしばらく継続サポートされるはず
めんどくさいことになってるな
648デフォルトの名無しさん:2011/07/04(月) 08:09:45.22
変えるときはドカッと変えて、
変えたってことがわかるようにバージョン番号だけじゃなくて、
コードネームも付けとく方が色々と良いことがわかったぬ。

島根の神々シリーズつけようぜ!
http://www.shimane-shinwa.jp/person/genealogy.php

イザナミ
イザナキ
スサノオ
ユクヨミ
アマテラス
かっけぇ!
649デフォルトの名無しさん:2011/07/04(月) 11:25:10.52
>>647
その情報はかなり古い。MLを見ている感じだと、

☆1.8.6は事実上死んでいる
☆1.8.7は多分あと1年くらい
☆1.8.8はリソース不足で出せなそう

なので公式サポートはあと1年と見積もってる。
まあ正式発表はRubyKaigiで出ると思う。

ただし公式より頼りになるREEサポートはまだ続く。
1.8にしがみつきたい人はREE買えってことになると思う。
650デフォルトの名無しさん:2011/07/04(月) 11:54:11.04
>>648
嫌いじゃ無い。
中二病くささがたまらんな。
651デフォルトの名無しさん:2011/07/04(月) 12:06:29.28
>>649

1.8.8 は誰も求めていないし1.9への移行の妨げにもなったりいろいろ
リソース不足ではなく開発者が1.8.8に興味ないから誰も触らない

http://redmine.ruby-lang.org/issues/4239#note-103
http://redmine.ruby-lang.org/issues/4207#note-20
652大天使 ◆uL5esZLBSE :2011/07/04(月) 13:48:13.31
質問です
firefoxの2chの忍法帖クッキーは
C:\Documents and Settings\uyuy\Application Data\Mozilla\Firefox\Profiles\i2ip2n78.defaultここで

s = open("./cookies.sqlite" , "r").read
p s.size
n = s.index'FOXdayo'
p n
p "HAP=" + s[ n ... n+327]

こうしたら取得できたんですけど、IEのクッキーが保存されていると思わしき
C:\Documents and Settings\uyuy\Local Settings\Temporary Internet Files
ここのフォルダのファイルはなにやら特殊な感じで検索しようにも上手くファイルオープンもコピーも出来ません
IEのクッキーから2chの忍法帖のクッキーを取り出すにはどうしたらいいですか?
653大天使 ◆uL5esZLBSE :2011/07/04(月) 14:02:09.65
目でおって検索して見つけて自己解決して解決しました ありがとうございました
654デフォルトの名無しさん:2011/07/04(月) 14:05:02.53
>>651
実際問題として、1.8.7をメンテナンスしていったほうがいいと思う
1.8.6と1.8.7の問題が1.8.6と1.8.7と1.8.8の問題に増えるだけで、誰も喜ばない
655デフォルトの名無しさん:2011/07/04(月) 14:29:03.35
>>651
唯一興味を持っていた1.8.8メンテナの武者さんに時間の余裕がないという話なので。
資金のないOSSでは興味ある人がいないのとリソース不足はほぼ同義だよ。
656大天使 ◆uL5esZLBSE :2011/07/04(月) 15:00:46.04
処理系は1個だけのほうが良いに決まってる
657デフォルトの名無しさん:2011/07/04(月) 15:26:23.36
>>654
1.8.8を作るメリットもないですしねえ

1.8の未来についてRubyKaigiで語られる可能性も(1日目のアナウンス枠で)あるみたいだしそこでいろいろ聞けるかもしれないですね
[ruby-dev:44027]
658デフォルトの名無しさん:2011/07/04(月) 15:40:49.40
Ruby on Railsとrubyはどっちがおすすめでしょうか?
659大天使 ◆uL5esZLBSE :2011/07/04(月) 15:45:37.56
Ruby

RoRは言語じゃなくて
rubyインストール後に
gem install rails とかやるとインストールできるRubyのとあるライブラリのいんでっくす
660デフォルトの名無しさん:2011/07/04(月) 19:24:17.28
英数字の全角と半角の混ざった文章。
誰かが何処かで書いてたな...
661デフォルトの名無しさん:2011/07/04(月) 20:42:49.47
>>659

ライブラリのインデックスじゃなくてWebアプリケーションフレームワークだろ

複数インストールされるのはただ部品を分けてるだけ
662デフォルトの名無しさん:2011/07/04(月) 20:56:09.38
>>661
枕詞みたいなものなんだろう
とある→インデックス(とある魔術のインデックスってアニメがある)
知らない人は混乱しても仕方ないね
663デフォルトの名無しさん:2011/07/04(月) 21:03:49.20
禁書目録ね
この回答を書きたいがための質問のようにも見えちゃうね
664デフォルトの名無しさん:2011/07/04(月) 22:41:58.46
>>662

禁書目録ネタか たしかにそうか
665デフォルトの名無しさん:2011/07/04(月) 22:50:42.11
このコテハン「大天使 ◆uL5esZLBSE」は天才チンパンジー「アイちゃん」が
言語訓練のために使用しているハンドルです。

アイと研究員とのやり取りに利用する書き込みなので、
関係者以外はレスしないで下さい。

                  京都大学霊長類研究所
666デフォルトの名無しさん:2011/07/04(月) 23:36:18.03
どっちかっつーと精神医学研究所とかのがしっくりくる
667デフォルトの名無しさん:2011/07/05(火) 00:33:12.45
オブジェクト指向がしっくりこないんです…
668デフォルトの名無しさん:2011/07/05(火) 01:01:29.85
[1,2,3]と[1,4,9]のそれぞれの要素を掛け算した配列を作りたい時に

[1,2,3].zip([1,4,9]).map{|a,b| a*b}

と書く以外に何かスマートな方法はあるでしょうか。
[1,2,3]と[1,4,9]が意味的に対等だったりするとなんとなくしっくりこないんです…

map((lambda x, y: x*y), (1,2,3), (1,4,9))
というふうに並べて書けたりはしないでしょうか。
669デフォルトの名無しさん:2011/07/05(火) 01:26:05.97


irb> require 'rubygems'; require 'narray'
irb> p (NArray[1,2,3] * NArray[1,4,9]).to_a
[1, 8, 27]

こうでいっすか
670デフォルトの名無しさん:2011/07/05(火) 01:34:13.40
[[1,2,3], [1,4,9]].transpose.map{|a,b| a*b}

transpose 長いな、転置。
671デフォルトの名無しさん:2011/07/05(火) 01:34:55.53
どうしてもオブジェクトとメソッドの引数って関係になりがちだからなあ
672デフォルトの名無しさん:2011/07/05(火) 01:39:34.14
2つの配列は固定なんだし先に計算しといて結果を埋め込めば良い
673デフォルトの名無しさん:2011/07/05(火) 01:39:59.13
eval %x{ python2 -c "print map(lambda x,y: x*y, (1,2,3), (4,5,6))" }
674デフォルトの名無しさん:2011/07/05(火) 01:45:19.06
配列の数が増えたり配列の長さが増えたり要素の値が変わったりはしないのかな
675デフォルトの名無しさん:2011/07/05(火) 01:48:04.40
一発で書けないと見せかけつつ実は書けそうと見せかけてやっぱり書けないという筆頭の処理なんだよねこれ
まあzipで中間配列作るのでいいやとか思ってる
676デフォルトの名無しさん:2011/07/05(火) 01:56:11.51
irb>(NArray['a', 'b', 'c'] + NArray['1', '2', '3']).to_a
["a1", "b2", "c3"]
ぬう…
677デフォルトの名無しさん:2011/07/05(火) 02:00:37.99
>>659>>661
ありがとうございます。基礎RubyonRailsという本を買いデータベースと接続の仕方などを
勉強しようとしましたが、webアプリケーション作りの本で何か自分の作りたいものと違うきがしたので
RonRはいったん中断しました。


Rubyで下記のようなwebからスクレイピングした、数字などの羅列データを
dbiを使ってMYSQLに記録してくプログラムを作りたいと考えています。

現状で自分にできることはwebからのスクレイピングと
rubyでDB(MYSQL)に接続して、外部ファイルからのデータの記録ですが
スクレイピングした数字や文字をどうやって、MYSQLに落とし込むかで
行き詰っています。先に進むためのヒントや解決策などはありませんでしょうか?
よろしくお願いします。

2011年07月04日
137
135
137
135
114,958,200
137
2011年07月01日
133
133
134
132
107,426,900
133
678デフォルトの名無しさん:2011/07/05(火) 02:25:26.41
最近スクレイピングネタが多いな
679デフォルトの名無しさん:2011/07/05(火) 02:29:17.94
正規表現の\Zと$の違いがよくわかりません。
680デフォルトの名無しさん:2011/07/05(火) 02:30:49.66
スクレイピングもできててDBへの記録もできるとなると何ができないのかよく分からんが
スクレイピングしたネタを一旦外部ファイルに書き込んでみれば?
681デフォルトの名無しさん:2011/07/05(火) 02:37:10.14
irb(main):001:0> a = "abc\ndef"
=> "abc\ndef"
irb(main):002:0> a =~ /c\Z/
=> nil
irb(main):003:0> a =~ /c$/
=> 2
irb(main):004:0> a =~ /f\Z/
=> 6
irb(main):005:0> a =~ /f$/
=> 6
682デフォルトの名無しさん:2011/07/05(火) 02:56:14.37
>>680
ありがとうございます。なんとなくやり方がわかったきがしました。

・スクレイピングして取得したものを一度テキストファイルに出力
・そのテキストファイルを、rubyでSQLのINSERT文に加工
・その後、rubyで加工したファイルをMYSQLに記録

全部を一回のプログラミングでやろうと考えていて、取得した文字や数字を
どうSQL文の形に変換すればよいのかわからず行き詰っていました。
まだ当分かかりそうですが、段階にわけてMYSQLニ落とし込んでみます。
683デフォルトの名無しさん:2011/07/05(火) 03:39:52.68
テキストファイルから取得したデータをどうやってSQL文にしたんだよw
684デフォルトの名無しさん:2011/07/05(火) 04:10:54.22
>>683
まだ、スクレイピングで取得したものを外部ファイルにする方法がわからず
たのしいRuby片手に悪戦苦闘しています。そういえばMYSQLは.sqlファイル
でした、全然わからないことが多すぎて質問もとかもトンチンカンで申し訳ないです。
685デフォルトの名無しさん:2011/07/05(火) 07:04:53.51
>>678
多いんじゃなくて一人
686デフォルトの名無しさん:2011/07/05(火) 07:29:38.09
>>648
izanami
izanaki
susano
yukuyomi
amateras

いけるな
687デフォルトの名無しさん:2011/07/05(火) 09:17:57.23
なんでテキストファイルに一度出力するの?

RubyでスクレイピングしてるならそれをそのままSQLにすればよくない?
688デフォルトの名無しさん:2011/07/05(火) 18:42:35.01
それができるほど習熟してないからだろ
689デフォルトの名無しさん:2011/07/05(火) 21:30:09.23
>>687
たのしいルビーでテキストファイルなどを読み込んだりしていたので、
テキストファイルなら簡単にできそうなきがしたもので書いてしまいましたが
SQLファイルで出したほうがよさそうですね。ありがとうございます。
690デフォルトの名無しさん:2011/07/06(水) 10:18:28.38
つかSQLファイルになんかせんで直接入れればいいんじゃないか?
691デフォルトの名無しさん:2011/07/06(水) 10:24:19.82
どうしてもDB/SQLの勉強したいっていうんじゃなければ
PStoreやYAMLで間に合わないか検討してからのほうがいいと思うよ
692デフォルトの名無しさん:2011/07/06(水) 12:53:17.62
PStoreオススメ
693デフォルトの名無しさん:2011/07/06(水) 13:38:11.16
便乗なんだけどスクレイプ元のデータが適当なんで(全角半角とか。一応処理してるけど)
一度人間の目を通してから保存したいときに使える形式ない?
694デフォルトの名無しさん:2011/07/06(水) 13:45:10.87
なんか、なんていうか、俺が知らないだけで、世の中にはバイナリ限定な形式がものすごく溢れてるのか?
テキストで処理したならそのまんまテキストでいいだろと思うのだが
695デフォルトの名無しさん:2011/07/06(水) 13:51:11.38
>>694
1エントリ1ファイルってことか?
696デフォルトの名無しさん:2011/07/06(水) 14:05:30.48
YAML, もしくは普通の表になってるならCSVかな

YAMLは標準ライブラリyamlをrequireしてHash#to_yamlでYAML化された文字列がとれる
697デフォルトの名無しさん:2011/07/06(水) 14:30:36.91
> yaml

irb> p YAML.load(YAML.dump("1\n \n2"))
"1\n\n2"

プッ

ちなみに Ruby 1.9.2 の psych では直ってる(というか、挙動が変更されてる)が Ruby 1.9.2 自体の再コンパイルが必要
698デフォルトの名無しさん:2011/07/06(水) 14:38:02.02
超一般論としてコンソール上で目視確認するのは辛い
テキストファイルに書き出してエディタとかで読んだほうがたぶんマシ
データ取得&整頓&書き出しのフェイズと目視確認後のファイル読み込み&データ適用のフェイズを分けておけばいい
変更点が多くて目視だとウォーリーを探せない状態なら整頓前後で外部 diff でもかけと毛
699デフォルトの名無しさん:2011/07/06(水) 14:52:10.93
配列とかにしちゃったデータを

      配列を保ったまま

人間が読めるテキストのようなものにしてあとで復元するのは意外とめんどくさい
Hash だとかなりめんどくさい
YAML が候補ではあるが、>>697のように改行とか微妙だし、

irb1.8> puts YAML.dump(["YAML", "まじ", "うんこ"])
---
- YAML
- !binary |
44G+44GY

- !binary |
44GG44KT44GT

という感じで dump した日本語が人間には読めない(バイナリ扱いなだけで、load で読むことはできる)
yaml ではなく ya2yaml を使うと日本語にはなるけど、あれってネストとかできたっけ
700デフォルトの名無しさん:2011/07/06(水) 15:50:26.56
最新1.9.3の開発版を使っているが
それだとちゃんと

---
- YAML
- まじ
- うんこ

になる
1.9.2の段階だと

---
- YAML
- "\xE3\x81\xBE\xE3\x81\x98"
- "\xE3\x81\x86\xE3\x82\x93\xE3\x81\x93"

になる
701デフォルトの名無しさん:2011/07/06(水) 15:52:54.94
>>700

に追記だがlibyamlがありpsychがインストールされていないとダメかもしれん
702デフォルトの名無しさん:2011/07/06(水) 15:58:56.99
そんな難しくないだろ
703デフォルトの名無しさん:2011/07/06(水) 16:11:36.87
>>700
ああ、それ psych の機能

$ ruby -ryaml -e "puts YAML.dump(['日本語'])"
---
- "\xE6\x97\xA5\xE6\x9C\xAC\xE8\xAA\x9E"

$ ruby -rpsych -ryaml -e "puts YAML.dump(['日本語'])"
---
- 日本語
704デフォルトの名無しさん:2011/07/06(水) 23:54:14.24
class Test
@@s = "Hello"
def self.method1
@@s
end
end

この@@ってなんですか?
705デフォルトの名無しさん:2011/07/07(木) 00:04:34.05
>>704
クラス変数

今はもうあんまり新規では使用されないので、忘れちゃってもいいぞ
706デフォルトの名無しさん:2011/07/07(木) 00:52:48.61
>>705
クラス変数はなぜ今は使用されないのですか?
代わりとなる機能があるからですか?
707デフォルトの名無しさん:2011/07/07(木) 08:34:00.25
>>703

後からpsychがデフォルトになってlibyamlが無いとダメだという事に気づいた

1.9.3 は確かpsychがデフォルト
708デフォルトの名無しさん:2011/07/07(木) 09:09:54.85
なぜ今は、というか、元々は存在しなかった。
確か安定版では 1.4 か 1.6 だったかで入った新機能。

クラスをシングルトン的に使う時に使う(Javaのクラス変数とかみたいに)ものだけど、
Rubyのクラス変数は継承しているクラス全部からいじれるとか癖のある副作用が
大きいので、そういう設計はしないのが普通ということになっている。
709デフォルトの名無しさん:2011/07/07(木) 09:23:16.84
>>705
ありがとうございます
とりあえず気にしないでおこうと思います
710デフォルトの名無しさん:2011/07/07(木) 15:11:59.31
protectedの使いどころが分かりません。
典型的な使いどころはあるのでしょうか?

privateはそのクラス内でのみ使う時に何となく利用してますが
サブクラスに継承されてしまうので、こちらもちゃんと使えているのか不安です。

rubyのアクセス修飾子は少しクセがあるように思うのですが私の思い違いですかね?
711デフォルトの名無しさん:2011/07/07(木) 15:15:52.17
protected は「私はRubyを理解していません!Java最高!!」というアピールをしたいときに使う
712デフォルトの名無しさん:2011/07/07(木) 15:22:20.06
>>711でFA

private はレシーバつきで呼ばれたときにエラーを返すようにする効果をもつ
アクセス制御でも可視性の設定でもない
「あいやーこのメソッドはレシーバつきで書いちゃダメなのね」
とユーザーに実感させる御利益しかない

ぶっちゃけ全部 public でも構わないぞ
「このメソッドは内部用だから外から使って欲しくないなあ」という場合はメソッドの def の行に :nodoc: って書いとけ
713デフォルトの名無しさん:2011/07/07(木) 15:35:20.56
>>706
俗に「クラスインスタンス変数」と呼ばれる概念がある
他の言語にはオフィシャルであったはずなんだけど、Ruby の公式には存在しない

class C
@var = 1
class << self
attr_accessor :var
end
def disp
self.class.var
end
end

p C.var #=> 1
p C.new.disp #=> 1
C.var = 2
p C.var #=> 2

これは「くらすたんいのへんすう」を提供できてなおかつ継承で流用されないというメリットがあるんだが、継承で初期値がセットされないという欠点もある

class D < C
end

C.var = 2
p D.var #=> nil
714デフォルトの名無しさん:2011/07/07(木) 15:38:26.34
まとめるとRubyではどう書くんですか?

PHPだと
class Abc
{
public $str;
public $num = 1234;

public function a(){echo 1;}
private function b(){return 1000000;}
protected function c(){echo 3;}
public static function d(){echo 11111111111;}
public function e(){echo $this->b();}

}
715デフォルトの名無しさん:2011/07/07(木) 15:40:26.29
>>713
継承でなんとかしてもらう方法
C.inherited は C が継承されたときに呼ばれることになっているこっそりメソッド

class C
@var = 1
class << self
attr_accessor :var
def inherited(klass)
klass.var ||= var
super
end
end
def disp
self.class.var
end
end

class E < C
end

p E.var #=> 1
716デフォルトの名無しさん:2011/07/07(木) 15:42:10.01
>>714
private と protected はそもそも再現不可能
public も動作違うんじゃないかな
717大天使 ◆uL5esZLBSE :2011/07/07(木) 15:51:47.67

class Abc
  attr_accessor :str
  attr_accessor :num
  def initialize
    @num = 1234
  end
  def a ; p 1 end
  private
  def b ; 1000000 end
  protected
  def self.c ; p 3 end
  public
  def d ; p 11111111111 end
  def e ; p self.b end
end
718デフォルトの名無しさん:2011/07/07(木) 15:58:46.87
protectedをデスってる人はrailsのソース読んだことないの?
719デフォルトの名無しさん:2011/07/07(木) 16:08:17.37
>>718
本当に読んだなら、この文脈でそんなことは言えないと思うの
720大天使 ◆uL5esZLBSE :2011/07/07(木) 16:32:38.64
rails読んだことないや
だって、ソースコードのメタ出力でしょあれ
どこに読む価値があるのか、ファイル名で教えて欲しい
721デフォルトの名無しさん:2011/07/07(木) 18:57:54.07
今書いてるコードを一行ずつ動かしたりしてどんな動作してるのか調べたいので
デバッグについて調べようと思ったんですが本屋でいくらか手に取ってみても
書いてある本がありません
おすすめの本とかサイトとかあれば教えてください
722デフォルトの名無しさん:2011/07/07(木) 20:05:33.35
protectedが必要なケースはとても少ない。
比較処理を実装するときに他インスタンス(自クラスorサブクラス)の非公開プロパティ
に対するアクセサが欲しくなったときに使ったくらいだな。

Rails症候群の研究 前田修吾
症例1(Case #1)
http://shugo.net/tmp/rails-syndrome.pdf

あなたの Ruby コードを添削します 青木峰郎
「可視性」
http://jp.rubyist.net/magazine/?0010-CodeReview#l20
「protected」
http://jp.rubyist.net/magazine/?0013-CodeReview#l34
「Ruby の protected は Java や C++ の protected ではない」
http://jp.rubyist.net/magazine/?0017-CodeReview#l5
723デフォルトの名無しさん:2011/07/07(木) 20:17:22.64
>>719の指摘が真っ当
protectedという文字が書かれているのは確かにたくさん見たが、
それが妥当なprotectedだったという例はあまり見たことがない
別にこれprivateでもいいだろ、というものばかり

というか、ぶっちゃけ、Rails書いた人はC++あたりの知識で勘違いしたまま書いてたんじゃないかと思う
怖くて変更できないし動いてるからそのまんまになってるだけだと思うなあ

>>721
Rubyはあんまりデバッガデバッガした環境が揃ってないんだよね
724デフォルトの名無しさん:2011/07/07(木) 21:05:14.64
privateメソッドだけどサブクラスから使うことを想定してますよ、
って意味を込めてprotectedにするのは駄目なのか?
725デフォルトの名無しさん:2011/07/07(木) 21:46:16.26
>>723
入門者がGUIでステップ実行、となればeclipseとかNetBeans使うしかない気がする
726デフォルトの名無しさん:2011/07/07(木) 21:55:14.66
>>724
自己満足でいいならご自由に。
727大天使 ◆uL5esZLBSE :2011/07/07(木) 22:22:11.60
つうかprotectedって概念が失敗
人はon(public)かoff(private)しか覚えられない
>>722の一番したのやつも、無理やり使用例作ってるけど
どうせ別の方法なんていくらでもあるんだろ
728デフォルトの名無しさん:2011/07/07(木) 23:10:04.23
rubyのprivateの実装が間違ってるから、privateを使うほうがおかしいという意味でprotectedを使ってるのに
722みたいに、Ruby界隈にはアホが多い
729デフォルトの名無しさん:2011/07/07(木) 23:13:10.79
>>728
名前はこの際二の次
protectedの動作が必要かというと、別に必要ではない
730デフォルトの名無しさん:2011/07/07(木) 23:14:01.25
privateの意味で使ってないからprotectedで正しいんだよ
731デフォルトの名無しさん:2011/07/07(木) 23:19:59.04
matzが2.0に大きな変化を入れようとしてた頃は、もう少しまともにしようと考えてたから、
あのまま大きな変更されてたら、private推進派は困ったろうな。
privateの動作じゃないところもprivateにしてるから
732デフォルトの名無しさん:2011/07/07(木) 23:23:04.52
意味なんてどうでもいい
実際の動作とは違う意味を持たせたいならそのようにコメントに書いとけ
protected と書かれた場合、それは protected としてのみ動作する
あたりまえ
733デフォルトの名無しさん:2011/07/07(木) 23:31:44.45
railsデスってる奴は馬鹿だね〜
ちゃんと意味を考えてprivateとprotected使い分けてるよ。
active_record/base.rb辺りのソース読めば分かるんじゃないかな。
734デフォルトの名無しさん:2011/07/07(木) 23:40:14.64
勘違いに基づいた使い分けをしているという話よ。
735デフォルトの名無しさん:2011/07/07(木) 23:42:44.42
日本人の中心的なRubyistたちは継承使うなとか言ってる馬鹿ばっかりなんだから真に受けたらだめよ
736デフォルトの名無しさん:2011/07/07(木) 23:45:51.35
>>735
継承はほとんどの場合必要ないよ
Mixinがあるもの

Mixinがないような言語での話はしてない
737デフォルトの名無しさん:2011/07/07(木) 23:47:58.37
他の言語ではクラスを継承するしかないような場面でも include するだけで終わったりするからな
他の言語では継承していたからといって、Ruby でも継承しなければならないということにはならない
その程度
738デフォルトの名無しさん:2011/07/08(金) 00:03:51.99
>>723
そうですか
他の言語も視野に入れてもう少し検討してみます
739デフォルトの名無しさん:2011/07/08(金) 00:12:45.87
クラス変数すらモジュールで定義できちゃうし、クラスじゃないと絶対駄目ってケースは無いな。
740uy ◆uL5esZLBSE :2011/07/08(金) 00:15:39.34
active_record/base.rbよんできたけど、サッパリだった 寝る
741uy ◆uL5esZLBSE :2011/07/08(金) 00:21:31.67
あれ。これは動作どうなってるの? Nilclassになった
module A
  class  << self < Hash
  p self
    def a
      p 4
    end
  end
end

nil.a # => 4 wwwwwwwww
742デフォルトの名無しさん:2011/07/08(金) 00:22:35.89
>>736-737
こういう馬鹿に毒されてるやつが多いから、どうしょもねーなーって思う
743デフォルトの名無しさん:2011/07/08(金) 00:33:51.21
継承の実質的なメリットは大きく分けて二つ

・型を揃えることでポリモーフィズムを実現する
・実装を共有する

前者はRubyでは必要ない
後者はmixinでもできるというだけであって、継承を使わない理由にはならない

もちろんOOPにおける継承は、最も強力で使いづらい機構とされているから
委譲が使えないか考える、といった一般的な指針は
考慮したほうがいいのだろう
744デフォルトの名無しさん:2011/07/08(金) 00:39:46.43
module至上主義の連中はRuby使ってない奴らなので実害はない
あいつらの理想に通りにライブラリ作っても、使いづらくて普及しないし
745デフォルトの名無しさん:2011/07/08(金) 00:50:16.07
継承って要は委譲のシンタックスシュガーみたいなもんだろ。
わざわざ言語に組み込むような機能じゃないわ。
746デフォルトの名無しさん:2011/07/08(金) 00:52:17.45
>>744
継承使うべきケースを一つでも提案してくれよマジで
747デフォルトの名無しさん:2011/07/08(金) 00:53:59.35
Rubyの中でも当たり前に継承使われてるのに、746みたいなこと言うんだもんな
748デフォルトの名無しさん:2011/07/08(金) 00:58:11.98
Rubyを宣伝する上でMix-inの存在が謳われた時期があって、その流れでmodule至上主義が台頭してきたわけだが、
奴らはMix-inでも出来るというどうでもいい理由で継承使わないだけだから無視してかまわない
749デフォルトの名無しさん:2011/07/08(金) 01:00:21.83
継承するってことは親クラスの仕様を全て理解して責任をとるってことだからな。
普通に考えて超〜めんどくさくね?
750デフォルトの名無しさん:2011/07/08(金) 01:03:30.99
じゃあBasicObject使いまくりなんだろうな
751デフォルトの名無しさん:2011/07/08(金) 01:07:32.83
多重継承を、単一継承とmixinの2ラインに「分けた」ところが
ポイントなのであって、mixinしか使わないのであれば
C++/Eiffelに逆戻りしてしまうだろう
752デフォルトの名無しさん:2011/07/08(金) 01:09:34.92
ある集まりで、クラスで書いたライブラリをmoduleにしろとダメ出しされて、
しょうもない実装にされたのを目撃したことがあります
753デフォルトの名無しさん:2011/07/08(金) 01:26:22.58
クラスで書くかモジュールで書くかの判断基準はどこに
754デフォルトの名無しさん:2011/07/08(金) 01:56:03.00
a

"aaa\n"
"bbb\n"
"ccc\n"

このようなaというファイルを下記のような配列に変換したいのですが
a.split("\n")とやってもうまくいきません。

["aaa","bbb","ccc" ]
このような配列にするにはどのようにしたらよいでしょうか?
755デフォルトの名無しさん:2011/07/08(金) 02:23:34.47
結局、protectedの使いどころはどこなんだ?
756デフォルトの名無しさん:2011/07/08(金) 02:40:47.31
派生クラス扱えるんだから全部protectedでいいんだよ
757デフォルトの名無しさん:2011/07/08(金) 02:42:26.51
プライベート→むしろなんかエロい
プロテクテッド→ガードが固いイメージ
パブリック→スポーツ感覚でパコパコしてそう
758デフォルトの名無しさん:2011/07/08(金) 03:06:48.73
こうして見てると、Rubyの実装っていかに糞で洗練されていないかってのがよく分かるな。
Rubyコミッタの質の低さは有名だが、それ以前の問題だなこりゃ。
日本発だのとチンケな意地を張ってないでRailsチームにRubyの開発も丸投げすりゃいいんだよ。
759デフォルトの名無しさん:2011/07/08(金) 03:11:11.29
privateの機能がないのにprivate使うのはどうかしてるぜ
760デフォルトの名無しさん:2011/07/08(金) 06:02:10.09
>>755
>>711

そもそも彼らは Java や C++ 「でそうであるから Ruby でも盲目で使っている」に過ぎない
Ruby での動作をきちんと吟味しているとは到底思えない、吟味してたらあんな変なもの絶対使わんw


…まあ、あの、あれだ、クラスメソッドを Hoge::mes と書ける、みたいに
既存の言語の真似をしてお客を呼ぼうということをしてた時期があって、
この private と protected はその太古の名残の遺跡のようなもんなのだ
Ruby 1.9 で消えるか「きちんと」実装されるかしてもよかったとは思ってはいる
なんか勘違いしてる人がいるんだが、使うなと言っている人はいわゆる「実装が糞」だから使うなと言ってるんだぞ
761デフォルトの名無しさん:2011/07/08(金) 06:33:53.19
他所の言語のユーザ増やしたくて媚びてる実装が嫌だな。

べ、別にあんたなんかの為に作ったんじゃないからねっ!
762デフォルトの名無しさん:2011/07/08(金) 06:42:23.82
>>754
いちばん簡単なのは、ファイル内容すべてを文字列として読み込んでしまってから文字列操作すること

str = File.open('a.txt', 'rb'){|f| f.read}
arr = str.split
p arr # => ["aaa", "bbb", "ccc"]

簡単で単純、問題は a.txt がべらぼうに大きかった場合はメモリを一瞬占有しまくること

File.foreach や File#each_line を使うこともできる

arr = []
File.foreach('a.txt'){|line| arr << line.chomp}
p arr

arr = []
File.open('a.txt', 'rb'){|f|
f.each_line{|line| arr << line.chomp}
}
p arr

1行ずつ読んでいちいち捨ててるのでメモリの増大はそうそう起きないが(GCのタイミング依存なので保証はできない)、
微妙に記述が多く、IO の性格上どうしても改行ごと持ってくるので String#chomp がどうしても必要
似たような見かけの readlines は全部読んでから配列に split してるだけなので御利益がなにもない
763デフォルトの名無しさん:2011/07/08(金) 06:54:48.18
括弧が無いのは好きじゃない
764デフォルトの名無しさん:2011/07/08(金) 08:29:24.21
>>754
>>762

File.read("a.text").split(/\r?\n/) でおk

File.readはファイルの中身を全部読み込んでクローズした後ファイルの中身の文字列を返す.
String#splitで文字を正規表現もしくは文字列で配列に分割
765デフォルトの名無しさん:2011/07/08(金) 08:35:59.67
>>764
File.read は初心者スレでは使ったら駄目
766デフォルトの名無しさん:2011/07/08(金) 08:45:40.79
splitの引数は/expr/使うんだ!
767デフォルトの名無しさん:2011/07/08(金) 09:29:16.80
こんな感じの処理で
require 'rss'
(略)
rss = RSS::Parser.parse(source, true)
rss.channel.items.each { |item|
    puts "#{item.title}"
}

RSSが
<channel>
 <title>タイトル</title> ←(1)
 <foo:bar>hoge</foo:bar> ←(2)
</channel>

(1)は上記の処理で出来るんですけど
(2)ように名前空間がついたものを参照する場合はどのようにすれば良いでしょうか?
768てんし:2011/07/08(金) 11:31:58.55
実装つうか、その概念の考え方の否定してRuby独自のパーソナルリアリティを作り出してんでしょ?
俺はC++やってた頃から継承使うなって言ってたはず、初期段階から中途半端な感じがしてた
継承とMix-inでは継承のほうが比較的「大きな道具」で、小さいほうの道具であるMix-inで済む場合は、そっち使うのが当たり前というか
しかもinclude,extendって2種類の方法用意されててしかもincluded,extendedまであっていたせりつくせりじゃん

継承の考え方って本来は、古いソースコードを、何も考えずに「機能を継承して」そこに機能追加したいとき使うものだと思う
バージョン管理をソース内でやっているようなもん
だから実際に今新規で作ってるときに継承使うっていうのは、用途がおかしいと思ってる
769デフォルトの名無しさん:2011/07/08(金) 12:20:10.04
LLバトロワスレの次スレ立ってるからそっちでやれ
770デフォルトの名無しさん:2011/07/08(金) 13:17:27.77
>>765
>File.read は初心者スレでは使ったら駄目

なんで?
771デフォルトの名無しさん:2011/07/08(金) 13:29:24.00
fileの中身が2GBとかだったらどうすんの
772デフォルトの名無しさん:2011/07/08(金) 13:38:46.52
1.8系だとバイナリモードを指定できないからとかいう話じゃないか
>>764でダメってのも脊髄反射な気もするが
773デフォルトの名無しさん:2011/07/08(金) 13:42:54.90
というか>>754の仕様だと全て配列にするのだから、結局オンメモリになるわけで
1行づつ読んだところで、ファイルがでかきゃ死ぬ。
多分、十分にファイルが小さいことが分かってるのだろうから、>>764でいいだろう。
774デフォルトの名無しさん:2011/07/08(金) 14:21:32.15
エスケープ表現(?)な文字列をエスケープされた文字列に変換したいのですが、
eval以外のやりかたってありますか?
いまは
foo='a\nb'
bar=eval('"'+foo+'"')

print foo
print bar

とやってるのですが、fooにスクリプトを入れられるのが怖くて

775デフォルトの名無しさん:2011/07/08(金) 14:24:49.02
>>767はがっかりしてるかもしれないが、標準の RSS ライブラリを使ってる人はあまりいない
わざわざ調べないといけないのでレスがないのだろう

んで File.read に関しては >>772 が正しい
Ruby 1.8.x ではバイナリモードにできないので、File.read は 1.8.x が消えるまでしばらくの間なかったことにするべき
標準ライブラリの実装は慎重にしましょうというありがたいお話

あと、1GBのテキストはメモリ上に保持できても1GBのテキストとそれを分割した配列(しめて2GB以上)を保持できるとは限らないので
即捨ての入力が即捨てできるようなら意識的にそうしておくべきだと思われる
初心者スレなら特に
776デフォルトの名無しさん:2011/07/08(金) 14:34:54.75
>>774
言葉の表現とやりたいことが矛盾してないか
777デフォルトの名無しさん:2011/07/08(金) 14:42:51.09
>>774
標準には無い
「バックスラッシュなんとか」を正規表現でgsubして\nなら"\n"にして\hexhexならpackしてという手作業が
なんか誰か作ってそうだけど
778デフォルトの名無しさん:2011/07/08(金) 15:01:23.41
>>767
仮にfoo:barがdc:creatorであればrss.channel.dc_creatorでアクセスできる
都合が悪くなければRSSのURL晒すとレスがつきやすいと思うよ
779774:2011/07/08(金) 15:51:46.75
>>776

string.dumpの逆がやりたいんですが、なんて表現したらよかったんですかね


>>777

やっぱりないんですか
用途的には需要ありそうですが。。。
ちょっと考えます
780デフォルトの名無しさん:2011/07/08(金) 16:11:24.88
>>762>>764>>773
ありがとうございます。無事配列に収めることができました。
781デフォルトの名無しさん:2011/07/08(金) 16:39:50.92
立て続けに質問すいません。
>>754の改行\nの記号を消して配列に収めたいのですが
どうすればよいでしょうか?
str = File.open('a.txt', 'rb'){|f| f.read}
str.delete("\n")
arr = str.split
p arr



str =File.read("a.txt").split(/\r?\n/)
str.delete("\n")
p str

などやってみましたが
["\"aaa\\n\"", "\"bbb\\n\"", "\"ccc\\n\""]
となります。
["aaa","bbb","ccc" ]こんな感じにしたいです。
782デフォルトの名無しさん:2011/07/08(金) 16:50:31.82
うむ、ほぼ全員がファイル内容を勘違いしてるな
すべての行がダブルクォートで囲まれて、改行などがバックスラッシュ記法されてるという変なファイルだ

ということで、

str = File.open('a.txt', 'rb'){|f| f.read}
arr = str.scan(/^"(.+?)\\n"$/).flatten
p arr

でどっすか
783デフォルトの名無しさん:2011/07/08(金) 17:02:06.29
直列化するときにファイルにpで出力してるってことか

>>781
ファイルに保存するときに
printやputsで吐くようにしたら楽になれるかも
784デフォルトの名無しさん:2011/07/08(金) 17:08:57.80
>>783
改行の復元で泣きそうだが…

改行文字を「絶対含まれない文字列」に置き換えればいいんだけど、それができるならここで悩まないと思う
785デフォルトの名無しさん:2011/07/08(金) 17:35:19.29
>>782
ありがとうございます。
出力結果は[ ]になりダメでしたが、scanで、\n以外を配列にしてflattenで
配列を平滑化するというやり方勉強になリました。
>>783>>784
ファイルに吐き出す段階も見直してみます。ありがとうございます。
786デフォルトの名無しさん:2011/07/08(金) 17:47:54.73
そりゃただの正規表現のマッチングだからな
実際の文字列がどうなってるかなんてわからんのだし、自力で正規表現書くしかない
787デフォルトの名無しさん:2011/07/08(金) 21:07:05.45
f.readってオンメモリなのか。2gb超のファイル読ませたらosごと堕ちたからなんだこれ?と思ってたw
788デフォルトの名無しさん:2011/07/09(土) 02:36:59.47
ヒアドキュメントで末尾に改行が付くのを回避するには、

<<HEREDOC.chomp
Hello,
World.
HEREDOC

と書くしかないのでしょうか。
789デフォルトの名無しさん:2011/07/09(土) 02:45:24.58
特異メソッドの一覧を取得するメソッドはありますか?

class << obj
instance_methods
end
このように特異クラスをオープンすれば可能なのですが、
objに対して直接メッセージを送って取得したいのです。
790デフォルトの名無しさん:2011/07/09(土) 06:24:10.04
>>788
はい
まあヒアドキュメントってそんなもんだと思うので仕方ないかと
テスト書くときにめんどいっすな

>>789
特異クラスという言葉は使わないほうが紛らわしくなくていいと思う
Ruby 内部ではぜんぜん特別扱いされてないし

というわけで特別扱いされてるシングルトンメソッド一覧を singleton_methods ではりきってどうぞ
791デフォルトの名無しさん:2011/07/09(土) 07:04:19.00
>>789
意図的な曲解はディベートの正当なテクニックだぞ
曲げて取られるのはお前に隙があるから
792デフォルトの名無しさん:2011/07/09(土) 08:14:17.68
お前が消えろゴミ >>791 という罵倒は正当だな
793デフォルトの名無しさん:2011/07/09(土) 17:10:13.70
1.8.7 の寿命を確定させようとする議論が始まったみたいだ

http://redmine.ruby-lang.org/issues/4996
794天使:2011/07/09(土) 18:04:18.24
勝手に「ゴミ」って単語使わないでください

数段上の立場にいる奴が下層の者を指すときに汚いものを見るような目で(実際に汚い)見下しながら吐く言葉であって
同レベルの「人間」同士でゴミゴミ言ってゴミゴミしていても所詮どちらもゴミゴミ
にしかみえない
795デフォルトの名無しさん:2011/07/09(土) 18:15:30.21
名字が五味の俺はどうすれば・・・
796デフォルトの名無しさん:2011/07/09(土) 18:16:04.07
>>793
まあ基本スレ違いだ
傾向が固まるまでは本スレとかでやってくれ

あと、そこに書いてある Windows 版の 1.9.1 と 1.9.2 が妙に遅いというのは観測的事実だ
あらゆるスクリプトを 0.2 秒で実行できるような環境だと気付けないんだけども
797デフォルトの名無しさん:2011/07/09(土) 20:01:12.10
>>795
広恵さんとケコーンすればいい
798デフォルトの名無しさん:2011/07/10(日) 00:33:04.72
rubyでファイルをひらくときに 
File,open(ファイル)か、open(ファイル)
の違いがわからないのですが
どっちでも同じことなのでしょうか?
799大天使 ◆uL5esZLBSE :2011/07/10(日) 01:30:28.74
rubyは、いろんなものが同じに見えて実は内部でちょっとずつ動作違うメソッドが大量にあるけど
File.openとopenは多分同じ
基本的に短いほうでいいとおもうよ
800デフォルトの名無しさん:2011/07/10(日) 01:53:59.89
多分って、おまえマニュアル全部暗記したんだろ?
801デフォルトの名無しさん:2011/07/10(日) 05:06:29.16
>>798
同じではない
File.open は引数をファイルパスとみなしていきなり File オブジェクトを生成しようとするが、
関数的メソッド open は引数がパイプ記法であるかどうかをチェックしてから File.open を呼ぶ

irb> p open('|ruby -v'){|f| f.read}
"ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-linux]\n"

Ruby 1.9 では to_open メソッドが動作するならその戻り値の IO オブジェクトが利用される

irb1.9> class C; def to_open; open('|ruby -v'); end; end
irb1.9> p open(C.new){|f| f.read}
"ruby 1.9.2p180 (2011-02-18 revision 30909) [i686-linux]\n"

ああ、1.8.7 のバージョン古いなあ

もちろん open-uri ライブラリで動作が上書きされるのも関数的メソッド open のほう
ファイルを開きたいだけなのなら、File.open を使用する癖をつけたほうが本当は好ましいんだが、若干書くのめんどい
802デフォルトの名無しさん:2011/07/10(日) 07:23:49.03
>>799 >>801
お答えいただきありがとうございます。勉強になりました。
803デフォルトの名無しさん:2011/07/10(日) 15:33:03.56
上のほうでクラス変数あんま必要ないとかあったけど
シングルトンの時とか使わんの?
804大天使 ◆uL5esZLBSE :2011/07/10(日) 17:17:23.66
>>800
暗記でいいよ、少なくとも「読んだ」って言うとお前たちゴミはすぐ勘違いするから


>>803
クラス変数? 使うにきまってんだろ

ここ学校じゃなくて所詮2ちゃんねる
ネット上の無責任なリソースの中で役立つのはソースコードのみで
そいつ自身の考え方なんて、95割ゴミ 聞く価値はない
たとえ言語開発者が使うなといっていても、言語開発者がプログラミング設計の全てを知ってるわけじゃないので
使える道具は多いほうが良いのは当たり前、ただ将来的に長く使って行くソースコードだったら
Rubyの仕様変更の被害にあいそうな可能性をもつ記述は避ける
805デフォルトの名無しさん:2011/07/10(日) 17:22:41.00
>>803
特異メソッドや特異クラスなら同様のインスタンスは生成できないから
RubyであまりSingletonを使う必要がないのよ
806デフォルトの名無しさん:2011/07/10(日) 21:04:56.05
rubyでsingletonって使ったことないな。
Java出身者が使ってるだけじゃねーの
807デフォルトの名無しさん:2011/07/10(日) 21:08:43.97
すっごく慎重に設計しないといけないので人気はない
808デフォルトの名無しさん:2011/07/10(日) 21:09:44.96
標準ライブラリに入ってるあたり、
昔はそれなりに使われてたんでは。
809デフォルトの名無しさん:2011/07/10(日) 21:14:45.26
何か慎重にならないといけないようなことあったっけ?
たまに使ってるけど、特に意識してることないなぁ
810デフォルトの名無しさん:2011/07/10(日) 21:15:54.99
Net::HTTPがSingleton使ってたはずだが(今でも使ってる?)、
なんかSingleton使わないほうが素直な構成になるんじゃないかみたいな奇妙な違和感が…
811デフォルトの名無しさん:2011/07/10(日) 22:31:19.00
よくある例だとロガーとかDBセッション関係とかかね
でもそのへんて既存のもの使っちゃうから意識して書くことは少ないか
812デフォルトの名無しさん:2011/07/11(月) 04:47:52.56
オブジェクト.each {|変数|
813デフォルトの名無しさん:2011/07/11(月) 04:56:36.99
オブジェクト.each do |変数|
繰り返したい処理
end


オブジェクト.each {|変数|
繰り返したい処理
}


rubyには、上のようにブロックを使う書き方と使わない書き方がありますが、
普段みなさんはどちらを主に使っていますでしょうか?

file.closeなどしなくていい分、ブロックを使うやり方の方が便利なのかなと思っていましたが
ここのみんさんはブロックを使わないやり方で書いてる方が多いようなきがしたので、局面で
それぞれ違うと思いますが、どういった使い分けか知りたくなりました。
よろしくお願いします。
814デフォルトの名無しさん:2011/07/11(月) 05:57:06.46
>>813
結合度の違いはあるけど、両方ともブロックを使っているように見えます
815デフォルトの名無しさん:2011/07/11(月) 06:23:35.53
>>813
do 〜 end も { 〜 } も同じブロック。
例えばopenならどっちで書いてもcloseされる。
なのでその目的ならどっちで書いても一緒。

んで両者の違いは結合度、詳しくはマニュアルの「ブロック付きメソッド呼び出し」辺りを参照のこと。
ttp://www.ruby-lang.org/ja/man/html/_A5E1A5BDA5C3A5C9B8C6A4D3BDD0A4B7.html#a.a5.d6.a5.ed.a5.c3.a5.af.c9.d5.a4.ad.a5.e1.a5.bd.a5.c3.a5.c9.b8.c6.a4.d3.bd.d0.a4.b7

その挙動に依存するのは控えたほうが良いので結局は好みの領域になるんだが
個人的には { 〜 } を基本にしてる。do 〜 end のほうが書きやすく直感的な場面よりも
{ 〜 } のほうが書きやすく直感的な場面のほうが自分には多いようなので。
816デフォルトの名無しさん:2011/07/11(月) 07:25:17.78
>>813
>ここのみんさんはブロックを使わないやり方で書いてる方が多いようなきがしたので
いや、全員がブロック使ってるはず
ブロック使わないような書き方してる人は質問側の初心者の人だけだ
内部で改行すると見かけのネストが深くなってしまうという見栄えの問題以外で、ブロックのデメリットはない

…いや、まあ、見えていないコードが見えない場所で実行されることについての指摘はある
ブロックつきメソッドの作成者が ensure を設定していれば 「}」 の部分で大量のコードが自動実行されるわけだからね
でもメソッド作成者が角度とかきちんと考えて設定したものなので、乗っかってしまうほうが通常は安楽

do ... end と { ... } は
 ・ 1行でおさまるなら { ... }
 ・ 直後にメソッドチェーンが続くなら { ... }
という使われ方の傾向がある
これ以外は好みだったり気分だったり、そのメソッドのマニュアルでどっち使ってたかだったり
結合度というものがあって「ブロックの外」と関係するときの動作が厳密には違うんだけど、
>>815の言うようにこれの違いを利用してはいけないし発動させてもいけない
817デフォルトの名無しさん:2011/07/11(月) 15:09:23.75
Perl忍者=TreeBoa=天使=Uy=ロ板を荒らしてたキチガイ...etc
818813:2011/07/11(月) 22:10:40.08
>>814 >>815 >>816
両方ともブロックなんですね。大変勉強になりました。
{.... } こっちの方が魅力的に感じてきました。
ありがとうございます。
質問用にコテつけることにしました
820デフォルトの名無しさん:2011/07/12(火) 16:58:12.26
Ruby信者とモルモンは良く似ている
・他人の家にズカズカやってきて、求めてもないのに宣伝しまくる
・帰れと言ってもしつこく居座る
・やっと帰ったと思っても、次々違うヤツがやってくる
・自説は絶対であり、自説に同調しない者は、憐れなヤツだと思ってる
・自分が信じるのは結構だが、周りの人にも強制する
etc. etc...

神の王国なんかに入れてくれなくて結構なので、放っておいてくれ
821デフォルトの名無しさん:2011/07/12(火) 17:34:37.69
includeやらrequireでファイルを参照するのってカレントディレクトリのみでしょうか?
他にも「Cドライブのこのフォルダは参照の対象になる」とかってあるんでしょうか。
あるいは、それも自分で設定できるものなのでしょうか。

mygameというライブラリでゲームを製作してたんですが
rhodesという、アンドロイドソフト開発用のソフト?のインストールやら
rails環境を整えていたりしたらいつのまにかmygameをうまく読み込まなくなりました。

./sdl.dll: 127: -init_sdl(LoadError)

というエラーを吐くので、SDLを読み込めてないだけだと思うのですが
ちゃんとSDL.dllは
C:\bin の中に入っています。

SDL.dllはどこに置くべきなのでしょうか。

環境は
OS : win7 64bit HomePremium
Ruby : 1.8.5
です。
822デフォルトの名無しさん:2011/07/12(火) 17:34:51.83
自分のおこないがそのままだとなぜ気づかない
↑Ruby初心者スレにズカズカやってきて、求めてもないのにdisりまくる
↑やっといなくなったと思っても、次々違うヤツがやってくる
↑自説は絶対であり、自説に同調しない者は、憐れなヤツだと思ってる
↑自分が信じるのは結構だが、周りの人にも強制する

自分がそういう奴だから、他人がそういう風に思えるんだろうな
823デフォルトの名無しさん:2011/07/12(火) 17:53:27.54
>>821
Ruby のバージョンがあまりにも古すぎる
動作しないスクリプトのほうが多いぞそれ

せめて 1.8.6、Rails があっても 1.8.7 が欲しい
824デフォルトの名無しさん:2011/07/12(火) 18:24:39.05
>>823
1.8.7のActiveRubyで再インストールしなおして直りました。
ありがとうございます。
こんな簡単なことに気づかないで申し訳ないです。

まる二日を環境変数いじったり、再インストールを何度もしたり
あきらめてサブPCに初めてlinuxをいれて結局そっちもあきらめたりして泣きそうでした。
825デフォルトの名無しさん:2011/07/13(水) 17:37:39.68
ruby初心者です(>_<)
csv形式のログファイルを取り込んで、適した形式に整形してgnuplotで出力したいってのが最終目的です。

そこで今は『,』をタブに変換して、いちおgnuplotの形式には出来ました(^O^)

ただ今の問題は,ログファイルの中身に月日時分秒のデータがあるんですが、一番最初のログをとった時間を0秒にしてデータを書き換えたいと思ってます(>_<)
現在csvファイルからのデータ入力をreadlineで読み込んで、配列に格納してるんですが、時間の整形をどうやれば良いか全く解りません。

ちなみに自分は元々C++をしてました。

説明下手ですいませんが、宜しくお願いします。
826デフォルトの名無しさん:2011/07/13(水) 18:15:18.62
>>825
DateTime.strptime
DateTime#strftime
827デフォルトの名無しさん:2011/07/13(水) 23:42:48.92
class String
 def set_default_value
  # self = "hello, world" したい
 end
end

class Array
 def set_default_value
  # self = ["hello", "world"] したい
 end
end

class Integer
 def set_default_value
  # self = 3 したい
 end
end
こういうのってどう実装すればいいんですか
できればインスタンス自体はそのままで値だけを変えたいんですが統一的な書き方ってあるんですか
828デフォルトの名無しさん:2011/07/14(木) 00:01:41.94
>>827
何がしたいのかいまいちつかめないが
「オブジェクトのメソッドを使って、オブジェクト自身の値を変更したい」ということなら
replaceというそのものズバリなメソッドがある

ただしIntegerにはreplaceはない
829デフォルトの名無しさん:2011/07/14(木) 06:18:00.06
>>827
単に入れもののクラスを作ればいい
たとえば URI は path の部分をあとからメソッドで変更することができる

Ruby に最初から備え付けられているクラスを再オープンしてメソッドを追加するのはあまりおすすめしない

というか、クラス作るのめんどくさいので {:key => 値} のHash で持ち歩くことが多いかと思う
830デフォルトの名無しさん:2011/07/14(木) 12:24:02.92
>>828,829
replaceでいけそうです。
Integerの例は思いつきで書き足しちゃったんですが
実装考えたら無理な話ですね。

ありがとうございました。
831デフォルトの名無しさん:2011/07/14(木) 14:31:12.15
下記の3つ目の出力はどうしてNameErrorが起こるのでしょうか?

class C
 @foo = "foo"
 @HOGE = "hoge"

 class << self
  attr_reader :foo
  attr_reader :HOGE
 end

 def self.hoge
  @HOGE
 end
end

p C::foo # => "foo"
p C::hoge # => "hoge"
p C::HOGE #=> uninitialized constant C::HOGE (NameError)

クラスに固有の定数をクラス外から利用したい場合は、どう記述するのが正解なのでしょうか?
832デフォルトの名無しさん:2011/07/14(木) 14:33:16.82
@@HOGEじゃないのかい?
833デフォルトの名無しさん:2011/07/14(木) 14:41:19.25
定数なら@なんて付けずに、単に

class C
    HOGE = "hoge"
end

とすればC::HOGEでアクセスできるよ
834デフォルトの名無しさん:2011/07/14(木) 14:50:23.28
定数はpublicなのかー
835デフォルトの名無しさん:2011/07/14(木) 14:51:39.97
C::HOGE = 'huga'
警告でるけど書き換えれちゃうのね
836デフォルトの名無しさん:2011/07/14(木) 15:21:27.68
まあ、Ruby は定数の使いどころ難しいしな
他のクラスから参照できたりメソッド再定義で利用できたりすると便利な気がする、そのクラス特有の固定データ、みたいな感じ
そのクラス専用に定数を作ることはあんまりないんじゃないかな
837デフォルトの名無しさん:2011/07/14(木) 15:24:19.54
>>834
1.9.3 でprivate_constantが導入されるみたいだよ
838デフォルトの名無しさん:2011/07/14(木) 15:33:08.72
そんなにプライベートクラス欲しいか?

…うん、あれば便利ではあるな
839デフォルトの名無しさん:2011/07/14(木) 15:41:52.04
>>838
private_class = Class.new{|klass| ... }
があるじゃないか、一応
840デフォルトの名無しさん:2011/07/14(木) 15:59:14.35
クラスは単なる定数だからprivate_constantがあればOKなんじゃ
841デフォルトの名無しさん:2011/07/14(木) 16:38:21.54
>>840
これ、プライベートクラス作成用に導入されるのよ
いわゆるフツーの定数の可視性をどうにかしようと思ってのことじゃない
842デフォルトの名無しさん:2011/07/14(木) 17:20:02.55
>>831
クラス名::ほげほげ
は大文字で始まって括弧が付いてないと定数と見なされるのでエラーになってる

C::HOGE()
とか
C.HOGE
だと大丈夫

::演算子はそもそも定数用でメソッドが呼べるのはおまけ機能
メソッドは.で呼ぶようにしたほうがいい

でも、そもそもふつうに定数を使えばいいような気がする
843デフォルトの名無しさん:2011/07/14(木) 17:23:56.73
大文字メソッドはちょっと不思議
def AAA() :A end
AAA() #これならメソッドして呼べるけど
AAA #だとそんな定数はないよといわれる

メソッドとローカル変数でも
def hoge() :method end
p hoge # => :method
hoge = :var
p hoge # => :var
p hoge() # => :method
なんだけど
844デフォルトの名無しさん:2011/07/14(木) 20:58:47.14
下記のmixってどういう意味なんでしょうか?

p Regexp.union(/a/, /b/, /c/) #=> /(?-mix:a)|(?-mix:b)|(?-mix:c)/
845デフォルトの名無しさん:2011/07/14(木) 21:02:13.00
オプションのmとiとx
846844:2011/07/14(木) 21:07:53.13
>>845

ばらばらで意味があったのかorz
ありがとうございます。
847デフォルトの名無しさん:2011/07/14(木) 22:53:51.03
Railsのプロジェクトに入ってruby勉強することになったんだけど、Railsのソースが無茶苦茶過ぎる。
標準クラスを拡張しまくってるからRubyのバージョンアップに対応できなさそう。というか怖くてバージョンアップできない。
スクリプト言語にこんな馬鹿デカいフレームワークが受け入れられている理由が全く分からん
848デフォルトの名無しさん:2011/07/15(金) 00:36:55.69
RailsはRubyから派生した別言語だよ
849デフォルトの名無しさん:2011/07/15(金) 23:51:01.77
>>847
お前には使いこなすだけの能力がないってことで

残念でしたね
850小池陸:2011/07/15(金) 23:52:59.93
うわあああ

三国志のリクソンじゃないよ 

小池陸だよ
みんなあつまれ
851小池陸2:2011/07/15(金) 23:53:29.05
集まったよ
わあ
852小池陸3:2011/07/15(金) 23:54:31.97
続編終わりました
どうかRubykaigiにきてください
おまちしていっ
853小池陸4:2011/07/15(金) 23:55:02.95
宇和ああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ
854小池陸5:2011/07/15(金) 23:55:18.65
ちょっとインクリメントしすぎたかな
855デフォルトの名無しさん:2011/07/16(土) 11:04:30.31
近代デジタルライブラリーの画像をダウンロード出来るkindai.rbというスクリプトを使うためだけにRubyを導入したのですが
以下のエラーが出ますがどのようにすれば動きますか。

OS winxp32bit
Ruby 1.9.2-p180
ImageMagick 6.7.1 Q16

C:\Ruby192>gem list

*** LOCAL GEMS ***

json (1.5.3)
kindai (1.7.0)
minitest (2.3.1, 1.6.0)
nokogiri (1.5.0 x86-mingw32)
rake (0.9.2, 0.8.7)
rdoc (3.8, 2.5.8)
rmagick (2.12.0 mswin32)
rubygems-update (1.8.5)
zipruby (0.3.6 mswin32)

C:\Ruby192>ruby kindai.rb 聖中心道肥田式強健術
ruby: No such file or directory -- kindai.rb (LoadError)
856デフォルトの名無しさん:2011/07/16(土) 11:05:16.79
C:\Ruby192>cd C:\Ruby192\bin

C:\Ruby192\bin>ruby kindai.rb 聖中心道肥田式強健術
C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:247:in `to_specs': Co
uld not find rmagick (>= 0) amongst [json-1.5.3, kindai-1.7.0, minitest-2.3.1, m
initest-1.6.0, nokogiri-1.5.0-x86-mingw32, rake-0.9.2, rake-0.8.7, rdoc-3.8, rdo
c-2.5.8, rmagick-2.12.0-x86-mswin32, rubygems-update-1.8.5, zipruby-0.3.6-x86-ms
win32] (Gem::LoadError)
from C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:759:i
n `block in activate_dependencies'
from C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:756:i
n `each'
from C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:756:i
n `activate_dependencies'
from C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:741:i
n `activate'
from C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems.rb:1183:in `gem'
from kindai.rb:18:in `<main>'
857小池陸:2011/07/16(土) 11:18:29.59

小池陸だよ
サインほしい人 みんなあつまれ

早くしないと消えちゃうよ
858デフォルトの名無しさん:2011/07/16(土) 12:00:47.75
>>855
C:\Ruby192ってことはRubyInstallerか
なんで初心者はmingw32使うかね
ああ、テンプレがないのか
初心者はmswin32(ActiveScriptRuby)使え
mingw32(RubyInstaller)は禁止

mingw32でRmagickを使うには
・ ImageMagick の dll とヘッダファイルつきの exe をどっかのパスにインストール
・ ImageMagick の include を環境変数 CPATH に、lib を環境変数 LIBRARY_PATH に設定
・ mingw32 Ruby のdevkit をインストール
・ gem で Rmagick をインストール
・ Rmagick のディレクトリで setup.rb
・ Rmagick のディレクトリで setup.rb install

というような手順が必要だったはず
つまり、全部自前でやる
今だと何か足りなかったり冗長だったりするかもしれないが
859デフォルトの名無しさん:2011/07/16(土) 12:16:51.80
>>858
ああ、あれ荒らしが消したんよ
仕返しだな

【バージョンに関するよくある流れ】

Ruby 1.8.5(非安定板)→ Ruby 1.8.6(旧安定版、長期政権)→ Ruby 1.8.7(超お勧め)
Ruby 1.9.0(旧開発版)→ Ruby 1.9.1(旧1.9系列安定版)→ Ruby 1.9.2(1.9系最新安定版)

実のところ、よくできた教科書またはトラブル時に聞き倒せる師匠がいるなら 1.9.2 から入っても特に問題はない
1.9.2ユーザーの場合は「1.9.2使ってます」と断った上で質問してほしい由

【Windows版に関するよくある疑問】

初心者の人はとりあえず ActiveScriptRuby の 1.8.7 使っておけば間違いない(mswin32)
http://www.artonx.org/data/asr/
の題字のでかい 「ActiveScriptRuby 1.8.7(pなんとか) with-winsock2 tcl-stub」

マニュアルはWebで見ることもできるが手元にあると便利、1.8.7 の HTML ヘルプ版が
http://www.ruby-lang.org/ja/documentation/
の「Rubyリファレンスマニュアル刷新計画 chm版 1.8.7用」

夢のお告げ等、何かの間違いで Ruby の知識がない初心者時代から 1.9.2 を使いたいマゾい人は
http://www.artonx.org/data/asr/ の「Ruby-1.9.2-p数字 Microsoft Installter Package」

「Windows版Ruby」として紹介されることのある以下の「RubyInstaller」は
これ特有のトラブルの修復知識が必要なので今のところは初心者には勧めない(mingw32)
http://rubyinstaller.org/
このトラブルを回避できるようになったら初級者脱出かも
860デフォルトの名無しさん:2011/07/16(土) 12:31:01.29
ActiveScriptRubyはアイコンがダサすぎるから入れないのが正解
861デフォルトの名無しさん:2011/07/16(土) 13:01:48.28
>>858-859
ありがとうございます。mswin32の1.8.7を試してみます。
862デフォルトの名無しさん:2011/07/16(土) 20:18:12.59
http://slashdot.jp/security/article.pl?sid=11/07/15/1648220&threshold=-1

matzもくるよ。おまいらも応募してみたら?
活かすも活かさないもあなた次第。
863デフォルトの名無しさん:2011/07/16(土) 23:43:04.80
サイボウズの方ですか?お疲れさまです
864デフォルトの名無しさん:2011/07/17(日) 02:06:40.47
マルチだし宣伝ウザ過ぎるな。
865デフォルトの名無しさん:2011/07/17(日) 02:42:20.00
何言ってんだよお前
matzが来るんだぞ
最重要事項じゃないか
866デフォルトの名無しさん:2011/07/17(日) 05:31:01.30
>>860
んなもん変えられるだろ…
867デフォルトの名無しさん:2011/07/17(日) 19:38:23.47
きもちわりーんだよ
あ?こら

あまのかお前てめえ調子ノンなこら
ネットギャングに県下うったのかあまのこら
ぶちのめずぞあまの
868デフォルトの名無しさん:2011/07/17(日) 22:33:15.57
ネットギャングwww乙
869292:2011/07/18(月) 06:36:27.05
大量にある日本語と英単語ありなテキストに指定桁数で改行を挿入したいです。
(nkfなどではダメでした。)

1.ファイルから一行を読みこむ。
2.先頭から文字を単位で読み込み。

行の先頭の改行はそのままにしたいので、
改行をchompするかは、とりあえずどちらでもいいとします。

2を行って英文字(ASCII)は一文字でカウント、
日本語は二文字でカウントしたいんですが、最適なメソッドってありますか?
870デフォルトの名無しさん:2011/07/18(月) 07:44:41.59
map と collect ってどう違うのでしょうか?
使い分け方はあるのでしょうか?
871デフォルトの名無しさん:2011/07/18(月) 08:04:25.93
同じ
気に入ったほう使う
872デフォルトの名無しさん:2011/07/18(月) 08:28:01.37
>>871
おなじでしたか、ありがとうございます。
873sora_h:2011/07/18(月) 15:33:24.54
RubyでHello world出す方法どうやるんですか?
頭の脳みその神経が途切れて脳みそパーになりました
教えてくださいお願いします。
874デフォルトの名無しさん:2011/07/18(月) 22:03:21.33
puts は使えるんですが、

print("2ちゃんねる")
のように一行だけでしても、出力されません
何がいけないんでしょうか
875デフォルトの名無しさん:2011/07/19(火) 02:17:21.94
もしかして: zsh
876デフォルトの名無しさん:2011/07/19(火) 15:53:24.95
人のソースを見てると、たまに「$Id」という記号にぶつかります。
なんとなくバージョン管理しているんだろうなとは思うのですが、
どのように使っているのでしょうか?
877デフォルトの名無しさん:2011/07/19(火) 16:02:47.01
878デフォルトの名無しさん:2011/07/20(水) 07:00:22.50
ruby 1.87を使い現在このコードを使ってウィンドウズのコマンドプロプントで
文字化けしないようにしています。

class StdoutHook
def write(str)
STDOUT.write NKF.nkf("--ic=UTF-8 --oc=Windows-31J", str.to_s)
end
$> = new

end

rubyファイルはUTF-8で保存しています。

下の文字をウェブからNokogiriでとってきたのですが、
putsだと
ソフトバンク(株)【9984】:株式/株価 - Yahoo!ファイナンス
pだと
["\343\202\275\343\203\225\343\203\210\343\203\220\343\203\263\343\202\257(\346\
240\252)\343\200\2209984\343\200\221\357\274\232\346\240\252\345\274\217/\346\24
0\252\344\276\241 - Yahoo!\343\203\225\343\202\241\343\202\244\343\203\212\343\2
03\263\343\202\271"]
となるのですが、この数字の羅列はバイナリ文字列というものでしょうか?
このバイナリ文字列から正規表現を使って"ソフトバンク(株)"と"9984"を抜き出したいのですが
どのような方法がありますでしょうか?
879デフォルトの名無しさん:2011/07/20(水) 07:59:03.21
定数 STDOUT は使用しない
暗黙の $stdout (つまり何も書かない)か、グローバル変数 $stdout を使う
まあ、>>878の場合は STDOUT と書くしかないんだけど、普通は使わないので他の人は「そんなのがあるんだ!」とか真似しないでくだされ

で、関数的メソッド puts と関数的メソッド p は動作も役割も違うし表示する形式も違う
そのへんは解説にきちんと書いてあるはずで、書いてないならその本燃やせ

puts obj はおおむね obj.to_s をそのまま表示する
ただし、obj が Array のように振舞える場合は each しながら各要素を to_s して表示する(1.8.x限定)
p obj は obj.inspect の結果をそのまま表示する
これは obj のクラスの作成者が「このクラスのオブジェクトの内容をデバッグ表示するときにはこうしたい」と思った形式で表示される

つまり、その戻り値が(Nokogiri の css メソッドか xpath メソッドを使った結果で)配列っぽいもので返っているのだろう
配列だから正規表現は動作しないよ
0要素目に欲しいデータ文字列が入っているなら [0] とかで取り出して使え

あと、最初にヒットしたものだけが必要なのなら Nokogiri で at 使っとけ
880デフォルトの名無しさん:2011/07/20(水) 08:01:06.38
環境を再現できないのですが、
ソフトバンク(株) の部分は "\343\202\275\343\203\225\343\203\210\343\203\220\343\203\263\343\202\257(\346\240\252)"
9984 の部分は "9984"
で良いのではないですか?
881デフォルトの名無しさん:2011/07/20(水) 11:01:31.82
h = Hash.new([])
h[0] << 0
h[1] << 1
p h.default #=> [0, 1]

defaultに代入してるわけじゃないのに、defaultの値が変わるのは何故なのでしょうか。
882デフォルトの名無しさん:2011/07/20(水) 12:16:23.52
Array#defalut や Hash#default は単一のオブジェクトを示す
だから、代入してるわけじゃないというか、はっきり(自動で)代入してる

ああもう使いにくいなあこのページ
http://doc.ruby-lang.org/ja/1.8.7/class/Hash.html
ずーっと下ると 「new(ifnone = nil) -> Hash」 と 「new {|hash, key| ... } -> Hash」 があるからそこ読んどけ

ご希望の "ハッシュ初期化" 動作は
h = Hash.new{|hash, key| hash[key] = []}
h[0] << 0
h[1] << 1
p h[0] #=> 0
で達成されるかと思う
h = Hash.new([]) とだけ書くと、配列オブジェクト [] が毎回使い回されてしまう
883デフォルトの名無しさん:2011/07/20(水) 12:49:24.14
いけてないよな
ホントはもっと使いやすいマニュアルあるんだろ
884881:2011/07/20(水) 15:03:16.40
>>882
ありがとうございます。
すっきりしました。
885デフォルトの名無しさん:2011/07/20(水) 21:21:13.95
rubykaigiが最終回だったって本当?
886デフォルトの名無しさん:2011/07/20(水) 23:27:39.09
Twitterで全ての日本語ツイートをクロールしたいのですが、どうすればいいですか?
あるキーワードやユーザーを指定しての収集はできるのですが、何の縛りもないとなるとやり方がわかりません
887デフォルトの名無しさん:2011/07/21(木) 00:36:28.48
>>886
・まずtwitter社と契約します
888デフォルトの名無しさん:2011/07/21(木) 00:39:35.35
・次にgoogleと提携します。
889デフォルトの名無しさん:2011/07/21(木) 00:45:08.12
google社はtwitter社にすべてのツィートを利用する権利を1億ドルぐらい払ってただろ。
890デフォルトの名無しさん:2011/07/21(木) 01:09:22.28
すいません全てのというかこれからアップされるものをリアルタイムに取りたいのです
891デフォルトの名無しさん:2011/07/21(木) 01:12:09.21
わらかすな
892デフォルトの名無しさん:2011/07/21(木) 01:27:04.96
tweepyなら楽勝
893デフォルトの名無しさん:2011/07/21(木) 01:43:26.01
とりあえずTwitterのドキュメント読もうぜ。
何が必要かは書いてあるはずだから。
894デフォルトの名無しさん:2011/07/21(木) 02:20:37.82
>>879
ありがとうございます。また違うやり方を考えてみます。
>>880
他の銘柄にも応用できるように正規表現を使いたかったのですが、どうもうまくいきませんでした。
ありがとうございます。
895デフォルトの名無しさん:2011/07/21(木) 03:29:07.53
クズしかおらんな。低脳は回答すんな迷惑だから。
896886:2011/07/21(木) 04:02:52.27
できました。みなさんありがとうございました

これアカウント停止とかならないですよね?(^^;;
897デフォルトの名無しさん:2011/07/21(木) 08:53:55.39
対策何も考えてないなら
アカウント停止もそうだがアクセスブロックされたりするんじゃね
898デフォルトの名無しさん:2011/07/21(木) 09:23:31.08
sora_hが質問してるスレはここですか
899886:2011/07/21(木) 11:48:29.36
>>897
対策って例えば何ですか?
900デフォルトの名無しさん:2011/07/21(木) 12:29:20.45
ActionView::Helpers::NumberHelperをウェブアプリではなく,通常のスクリプトで使いたい場合,
どのようにすれば良いのでしょうか?

require 'active_support/all'
ActionView::Helpers::NumberHelper::number_with_delimiter 123456789
#->NameError: uninitialized constant ActionView
include ActionView::Helpers::NumberHelper
#->NameError: uninitialized constant ActionView
的なことをやってもだめでした。

Date.today.months_ago 3みたいなのができるので,
同じかんじでやってみようとしたのですが...
901デフォルトの名無しさん:2011/07/21(木) 12:32:53.53
>>899
異常なアクセス量にならないように調整
902デフォルトの名無しさん:2011/07/21(木) 13:31:50.70
>>900

$ irb -ractive_support/all -raction_view/helpers/number_helper
> include ActionView::Helpers::NumberHelper
=> Object

で使えるようになるけど、区切りはロカール依存(小数点にコンマとか)なので、
i18n用の設定も必要だと思う。そのままだと

> number_with_delimiter(10000000)
=> "10000000"

とか…
903デフォルトの名無しさん:2011/07/21(木) 14:22:16.54
>>902
マジ,サンキューです。

> number_with_delimiter 123456789, :delimiter => ","
=> "123,456,789"
でとりあえず使えました。

なるほど
require action_view/helpers/number_helper
これね。
904886:2011/07/21(木) 14:41:49.80
>>901
あーそういうのがやっぱりあるんですか。。どうしようわからない
905デフォルトの名無しさん:2011/07/21(木) 19:01:00.73
下手すると不正アクセスだか威力業務妨害だか
以前あったよね図書館のサイトにうんたら
906デフォルトの名無しさん:2011/07/21(木) 19:59:20.94
active script ruby で実行すろと

C:\Users\Public\Desktop>ruby hello.rb
ruby: No such file or directory -- hello.rb (LoadError)

と表示され、実行できません。
hello.rbはしっかりと存在するのですが・・・
一体何が原因なのでしょうか?
907デフォルトの名無しさん:2011/07/21(木) 20:06:05.14
Desktopフォルダにhello.rbが存在しないのではないか
とりあえずdirでDesktopフォルダに入ってるファイルを確認

C:\Users\Public\Desktop> dir
908デフォルトの名無しさん:2011/07/21(木) 20:23:49.06
メモ帳で作ったので hello.rb.txt になっててなおかつ拡張子 .txt がエクスプローラの設定で見えないという説を押す
909デフォルトの名無しさん:2011/07/21(木) 20:37:00.76
解決しました。

C:\Users\Public\Desktop ではなく
C:\Users\名前\Desktop という自分の名前のフォルダにありました。

ありがとうございました。
910デフォルトの名無しさん:2011/07/21(木) 23:03:50.20
>>909
あーw

Windowsのデスクトップは見かけ上一ヶ所だけど
実際は全ユーザ共有のディレクトリと、いちユーザ個人のディレクトリを
混ぜこぜで表示してるから気を付けてね

コマンドプロンプト使うなら dir /p コマンドで
そのディレクトリのファイル一覧を確認するクセ付けるといいよ
911デフォルトの名無しさん:2011/07/21(木) 23:22:57.01
パブリックのデスクトップにファイル置かないなあ。紛らわしい。
912デフォルトの名無しさん:2011/07/22(金) 00:08:53.42
1.9にバージョンアップしたらmbchar?メソッドがNoMethodErrorになってしまいました。

日本語と英語が混じった文字列の(見ため)の長さを取得するために、
str.each_char do |c|
len += c.mbchar? ? 2 : 1
end
こんな感じのソースを書いていたのですが、1.9ではどのように処理すればいいのでしょうか。
lengthメソッドはローマ字もマルチバイト文字も同じ1文字とカウントしてしまいます。
913デフォルトの名無しさん:2011/07/22(金) 00:54:51.21
いちおう、ascii_only? というのが使えなくもない
1文字に対して ascii_only が true だったら 日本語環境で 1バイト幅だとみなしてよかろう
irb> p "1234あいう".chars.inject(0){|r,s| (r += s.ascii_only? ? 1 : 2);r}
10

半角カタカナは false としか言ってくれないので、結局は ord とか使って判別しなければならないけど
914デフォルトの名無しさん:2011/07/22(金) 01:56:43.95
始めたばかりの素人ですが質問させてください。
MacOS X snow leopard10.6.6を使っています。

ruby on railsをやりたくて、いろいろとやっていました。

script/serverでサーバーが起動しなかったので、
色々と試し各種インストールの途中からエラーが頻発するようになりました。
一旦リセットしたく思い、usr/local/bin にあったruby フォルダ
まるごと管理者権限で削除しました。

すると、完全にどうしようもならない状況に陥りました。
また初めから

Ruby1.9
Rails3
Gem 1.8.7

を入れたいのですが
どのようにすればいいか、
かれこれ6時間ほど悩んでいます。

もうsnow leopardをクリーンインストールするしか方法がないのでしょうか?

色々と試しましたがコンパイル出来ないとかエラーが出たので
readlineをインストールしようとしました。
しかし、その段階でもコンパイル出来ない!とエラーが出ます。

クリーンな状態にて Mac OS10.6で
ruby on railsが使えるようになる
方法を教えていただけませんか?

お願いします。
915デフォルトの名無しさん:2011/07/22(金) 02:12:25.74
なんでRails3でscript/serverなんだい
916デフォルトの名無しさん:2011/07/22(金) 02:21:09.11
>>941
もう rvm で環境作れば良いと思う。
https://rvm.beginrescueend.com/
917912:2011/07/22(金) 02:33:32.93
>>913
ありがとうございます。
うーむ、結構大変なのですね。その方法を使わせていただきます。
これも1.9で文字コード周りが色々変わった弊害なんですかね。。
918デフォルトの名無しさん:2011/07/22(金) 05:07:34.49
>>914
>usr/local/bin にあったruby フォルダ

こんなのあったっけ?
919デフォルトの名無しさん:2011/07/22(金) 07:38:02.29
>>914
OS のクリーンインストールをする必要はありません。
1. readline-6.2.tar.gz を入手します。
tar zxf readline-6.2.tar.gz
cd readline-6.2
./configure
make
sudo make install
これで readline はインストールできるはず。
(システム要求は autoconf 2.5 以上だけだと思う)

2. ruby-1.9.2-p290.tar.bz2 を入手します。
tar jxf ruby-1.9.2-p290.tar.bz2
cd ruby-1.9.2-p290
./configure
make
sudo make install
これで ruby と rails をインストールできます。

3. gem 本体を 1.8.5 にアップデートして rails 類をインストールします。
sudo gem update --sysytem
sudo gem install rails

4. あとは Rails3 のチュートリアルを参考にしていろいろ遊びます。
(sqlite3 本体と gem の splite3 ライブラリも必要かも)
WEBrick を起動する場合、Rails3 からは rails server で大丈夫です。
920デフォルトの名無しさん:2011/07/22(金) 07:50:08.44
1.9.2 だと libyaml (psych用) や libffi (fiddle用) は不要だっけ?
921デフォルトの名無しさん:2011/07/22(金) 08:09:51.24
ascii_only? はラテン文字に対しても false 返すぞ
Unicode で ZENKAKU 相当かどうかを返すようなメソッドはあってもいいとは思う
曖昧幅の場合なんて答えたらいいのかは知らん

>>920
rvm で自力コンパイルする場合は、libyaml はあったほうがいい(バイナリパッケージでは不要というか無意味)
最近は require 'psych' を一度試す gem が増えてきた
922デフォルトの名無しさん:2011/07/22(金) 13:32:45.38
>>919
非常にわかりやすい解説を
ご丁寧にありがとうございます。

2のruby1.9.2のセットアップ時に以下のエラーが出て1.9が入れられません。
どうすればよいのでしょうか?
(ちなみにインストールしているファイルは 
<URL:http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-p290.tar.bz2> です)


gcc -dynamic -bundle -o ../../.ext/x86_64-darwin10.6.0/tcltklib.bundle stubs.o tcltklib.o -L. -L../.. -L/System/Library/Frameworks/Tcl.framework -L/System/Library/Frameworks/Tk.framework -L.
-L/usr/local/lib
-lpthread -framework CoreFoundation -F/System/Library/Frameworks -framework Tcl -lpthread -framework CoreFoundation -framework Cocoa -framework Carbon -framework IOKit
-lpthread -framework CoreFoundation -F/System/Library/Frameworks -framework Tk -Wl,-undefined,dynamic_lookup -Wl,-multiply_defined,suppress -Wl,-flat_namespace -lm -ldl -lpthread -ldl -lobjc
ld: in /usr/local/lib/libxml2.2.dylib,
file was built for i386 which is not the architecture being linked (x86_64)
collect2: ld returned 1 exit status
make[1]: *** [../../.ext/x86_64-darwin10.6.0/tcltklib.bundle] Error 1
make: *** [mkmain.sh] Error 1
923デフォルトの名無しさん:2011/07/22(金) 13:39:22.87
コンパイルしたことのない人は自力でコンパイルなんてしたらだめだぞ
924デフォルトの名無しさん:2011/07/22(金) 13:42:59.23
--with-out-ext=tk 付きで./configureして再コンパイルで。

OSXに付いてくるTcl/Tkはx86/x86_64/powerpc(Snow Leopardまで)の
ユニバーサルバイナリなので、正しくそれとリンクするためにはRubyも
ユニバーサルバイナリとしてビルドする必要があるんじゃないかな。
正直いろいろ面倒なので、Railsをやる上では間違いなく使わないであ
ろうTkなんて外してしまうのが簡単だろう。
925デフォルトの名無しさん:2011/07/22(金) 13:48:51.54
>>923
完全なrequirementsくらいは一発で表示されて欲しいと思うことはある

> ld: in /usr/local/lib/libxml2.2.dylib,
> file was built for i386 which is not the architecture being linked (x86_64)
これは libxml2 の x86_64 アーキテクチャとしての再コンパイルが必要
たぶんこのあと sqlite3 あたりも再コンパイルが必要だと思う

Tk 外すと libxml2 は要らないんだっけ?
926デフォルトの名無しさん:2011/07/22(金) 13:57:44.54
すみません。理解したいのですが
何をどうすればいいか解りません。

927デフォルトの名無しさん:2011/07/22(金) 13:59:21.59
>>920>>921
libffi-3.0.9 と yaml-0.1.4 をインストールしてから ruby-1.9.2 をビルドしたら
各ラッパー(モジュール?)が作られてウマーになりました。
ありがと、ちゅっちゅっ。
928デフォルトの名無しさん:2011/07/22(金) 14:01:48.17
Ruby1.9.2をまっこすXでコンパイルしてインストールする、とかいう解説がどっかにあるかと思う
たぶんほぼ確実に同じとこで詰まってると思われるので、そこ参考にするといいかもしれん
929デフォルトの名無しさん:2011/07/22(金) 14:07:02.56
あれ、なんかこう、バイナリパッケージとかないん?
930デフォルトの名無しさん:2011/07/22(金) 14:09:56.28
Macだとxcode,gem,ruby,rails,その他各種などが強く連携しあってて
どれか一つでもバージョンが違うだけでインストールすら出来ないのですね。

Windowsだとワンクリックインストーラーがあるだけに
比較してみるとMacでのRailsは導入だけでも敷居が高すぎるのですね
931デフォルトの名無しさん:2011/07/22(金) 14:21:54.57
>>930
どこをどう読んだのやら。
932デフォルトの名無しさん:2011/07/22(金) 14:41:35.10
これまでの流れをまとめると

い) readline-6.2 と libffi-3.0.9 と yaml-0.1.4 と sqlite-3.7.7.1 を入手して
./configure
make
sudo make install
にてそれぞれをインストールし、下準備をする。

ろ) ruby-1.9.2-p290 本体のインストールでは Rails の使用が目的なので
./configure --with-out-ext=tk
make
sudo make install
のようにしてとりあえず Tk をはずしてビルドをしてインストール。

は) >>919 にあるように gem 本体をアップデートして Rails を入れる。

ということなのでしょうか?
933デフォルトの名無しさん:2011/07/22(金) 15:01:24.13
macportsを使えばカンタンらしい。ホントか知らんが。
>ttp://d.hatena.ne.jp/deeeki/20101030/mac_ruby19_rails3
934デフォルトの名無しさん:2011/07/22(金) 15:10:17.13
皆さん、ありがとうございます。

何とかRuby1.9.2とrails3.0.9とgem1.8.5 とそれぞれ最新版を入れることができました。
どこかのサイトに書いてあったとおり、そのままnginxというものを入れました。
これってブラウザで確認する際に一般的に使用するサーバーソフトですか?

railsだと script/server ってコマンドだけでサーバーが立ち上がると
いろんなところに書いてあるのですが立ち上がらず、調べてみると
rails3.0からは rails s のコマンドでいいとのことですが
それをして
http://localhost:3000 へ繋いでもうまくいきません。
935デフォルトの名無しさん:2011/07/22(金) 15:15:33.07
>>934
板違い
【RoR】Ruby on Rails Part12
http://hibari.2ch.net/test/read.cgi/php/1311050686/
936デフォルトの名無しさん:2011/07/22(金) 15:15:56.39
rails server とターミナルに叩いても下記のメッセージが出るだけで http://localhost:3000 にアクセスしても何もでません。

Usage:
rails new APP_PATH [options]
Options:
-r, [--ruby=PATH] # Path to the Ruby binary of your choice
# Default: /Users/taro/.rvm/rubies/ruby-1.9.2-head/bin/ruby
-d, [--database=DATABASE] # Preconfigure for selected database (options: mysql/oracle/postgresql/sqlite3/frontbase/ibm_db)
# Default: sqlite3
-b, [--builder=BUILDER] # Path to an application builder (can be a filesystem path or URL)
-m, [--template=TEMPLATE] # Path to an application template (can be a filesystem path or URL)
[--dev] # Setup the application with Gemfile pointing to your Rails checkout
[--edge] # Setup the application with Gemfile pointing to Rails repository
[--skip-gemfile] # Don't create a Gemfile
-O, [--skip-active-record] # Skip Active Record files
-T, [--skip-test-unit] # Skip Test::Unit files
-J, [--skip-prototype] # Skip Prototype files
-G, [--skip-git] # Skip Git ignores and keeps
Runtime options:
-f, [--force] # Overwrite files that already exist
-p, [--pretend] # Run but do not make any changes
-q, [--quiet] # Supress status output
-s, [--skip] # Skip files that already exist

Rails options:
-v, [--version] # Show Rails version number and quit
-h, [--help] # Show this help message and quit
以下略
937デフォルトの名無しさん:2011/07/22(金) 15:26:30.84
うむ、Railsそのものに関してはRailsスレに行ったほうがうまく説明してくれるかと思う
ここはRails使ってない人のほうが多いんじゃないかね
938デフォルトの名無しさん:2011/07/22(金) 15:37:18.26
まぁ、移動して欲しいけど、とりあえず。

* nginx は開発に使うだけなら不要。
* rails server は、作成したアプリのディレクトリで実行する。
939デフォルトの名無しさん:2011/07/22(金) 15:39:18.02
スレ汚し申し訳ありません。
色々とご教授いただきありがとうございました。
940デフォルトの名無しさん:2011/07/22(金) 15:49:56.71
guides.rubyonrails.org/getting_started.html を参考にするといいよ。
Rails が動くかどうかの確認をしたいのであれば

rails new blog
cd blog
bundle install ← ここはちょっと時間がかかるので筋トレをして待ちます
rails server

を順次実行していく。ターミナルに
=> Booting WEBrick
=> Rails 3.0.9 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
が表示されていることを確認してからウェブブラウザでアクセス!
あとは Rails スレで勉強するなりよ。
941デフォルトの名無しさん:2011/07/22(金) 16:06:46.22
皆さん本当にありがとうです。

さっそくrailsスレへ書き込みさせていただきました。
ブラウザで表示されるようになるまで
あと少しのところなので頑張ります!
もう一度ありがとうございます。
942デフォルトの名無しさん:2011/07/22(金) 17:24:53.24
>>933
ホントよ


「sudo port install ruby」の一行打てば、あとは勝手に
Rubyのソース落として依存するライブラリとかも全部落として
全部コンパイルして所定のディレクトリに配置するとこまで勝手にやってくれる

要はLinuxによくあるパッケージマネージャのMac版
他にもfinkとかhomebrewってパッケージマネージャがあるので
何らかのパッケージマネージャ入れておくとUnix系アプリの管理が楽だね
943デフォルトの名無しさん:2011/07/22(金) 17:53:07.54
>>917
もともとSJISの文字列か
SJISの範囲で収まるのならSJISに変換してから
String#bytesizeしてみてはどうか?
944デフォルトの名無しさん:2011/07/22(金) 19:48:55.80
mbchar?は何か理由があって廃止されたの?
945デフォルトの名無しさん:2011/07/22(金) 20:03:21.45
String#mbchar? は jcode.rb が提供していたメソッド。
jcode.rb 自体が1.9系ではEncodingの導入に伴い廃止。
1.8から持ってきて、 $KCODE 使ってる箇所を書き換えれば使えそうな気もするけど。
946デフォルトの名無しさん:2011/07/22(金) 20:14:20.60
>>945
おおなるほど。だから1.9の弊害みたいな話が上であったのね。
やっと意味が分かった。
947デフォルトの名無しさん:2011/07/22(金) 20:24:45.22
jcode.rb から正規表現をパクってEncodingを使うとこんな感じなんだろうか。
マルチスレッド? なにそれ? な造りだけど。

ttps://gist.github.com/1099265
948デフォルトの名無しさん:2011/07/22(金) 23:05:04.31
949デフォルトの名無しさん:2011/07/23(土) 03:25:10.35
macportsよりhomebrewの方がいいと思う。
950デフォルトの名無しさん:2011/07/23(土) 15:45:30.01
# あるファイルの内容を読み込んで置換して別のファイルに書き込む際、
# 置換の設定を別のファイルから読み込んで処理したいのですが、
# どうすれば良いでしょうか。
#
# 仮に次の四つのファイルがあるとします。
#
#  1.処理内容.rb (プログラムの本体)
#  2.入力元.txt (infile)
#  3.出力先.txt (outfile)
#  4.置換設定.rb (setfile)(置換の設定,これを読み込んで処理したい)
#
# 以下が具体例です。
#
#「1.処理内容.rb」の内容----------------------------------
def infile ; infile = '2.入力元.txt' end
def outfile ; outfile = '3.出力先.txt' end
# def setfile ; setfile = '4.置換設定.rb' end
open(infile, 'r'){|origin|
open(outfile,'w'){|output|
while line = origin.gets
#↓この部分の処理を別のファイル(4.置換設定.rb)で行いたい
line.gsub!('●','丸')
line.gsub!('へのへのもへじ','ヘノヘノモヘジ')
line.gsub!('漢字','kanji')
#↑この部分の処理を別のファイル(4.置換設定.rb)で行いたい
output.puts line
end
}
}
#-----------------------------------------------------------
#
# どうか知恵をお貸し下さい。お願い致します。
951デフォルトの名無しさん:2011/07/23(土) 16:03:59.77
ファイル読める知識があるのなら、置換ペアのファイル読んで内容の文字列をペアで指定すればいいだろ
プログラムがファイルに分離してると考えないほうがいい

…いや、考えてもいいけど、それはそれで最初はめんどくさいぞ
952デフォルトの名無しさん:2011/07/23(土) 16:26:54.36
>>950
置換設定.rbで
def process_line(line)
 line.gsub...
 return line
end
として、メインプログラムで

while line = origin.gets
 line = process_line(line)
 output.puts line
end

とすればいいんじゃないかな。
できれば
origin.each do |line|
 line = process_line(line)
 output.puts line
end
のほうがいいけど。
953デフォルトの名無しさん:2011/07/23(土) 16:45:36.52
その0:文字列を置換して表示する
str = "1234"
str.gsub!('1', 'ワン')
str.gsub!('2', 'ツー')
str.gsub!('3', 'さん')
puts str

その1:配列でgsubをまとめる
str = "1234"
replace_pairs = [['1', 'ワン'], ['2', 'ツー'], ['3', 'さん']]
replace_pairs.each do |pair|
str.gsub!(pair[0], pair[1])
end
puts str

その2:配列を外部から入力させてみる
str = "1234"
replace_pairs = []
File.open('replaces.txt','rb').readlines.each do |line|
replace_pairs << line.chomp.split(/\t/)
end
replace_pairs.each do |pair|
str.gsub!(pair[0], pair[1])
end
puts str
954デフォルトの名無しさん:2011/07/23(土) 16:49:12.41
その3:なんかタブ区切りがやたらとめんどくさかったのでYAML形式にする
require 'yaml'
str = "1234"
replace_pairs = YAML.load_file('replaces.txt')
replace_pairs.each do |pair|
str.gsub!(pair[0], pair[1])
end
puts str

# replaces.txt は --- で始まる
---
- ['1', 'ワン']
- ['2', 'ツー']
- ['3', 'さん']

その4:できた気がするので、ファイル入力とファイル出力も作る
require 'yaml'
input_path = 'input.txt'
output_path = 'output.txt'
replace_data_path = 'replaces.txt'
replace_pairs = YAML.load_file(replace_data_path)
str = File.open(input_path, 'rb'){|f| f.read}
replace_pairs.each do |pair|
str.read.gsub!(pair[0], pair[1])
end
File.open(output_path, 'wb'){|f| f.write(str)}

ぶっちゃけどっちもどっちだと思うので、
>>952のようにでっかい置換データを内部に持つ関数的メソッドを作って require するのでもいい
955デフォルトの名無しさん:2011/07/23(土) 17:36:12.08
>>953
横からなんですが、その2でオープンしたファイルは自動でクローズしているのでしょうか?
956デフォルトの名無しさん:2011/07/23(土) 17:59:17.17
File#readlinesだから、File.readと同じ理屈でメソッド内部で閉じてる
ファイルが大きい場合にはメモリを占有するのもFile.readと同じ
957デフォルトの名無しさん:2011/07/23(土) 18:27:39.52
>>950です。皆さんどうもありがとうございます。
>>952さんの内容で望んだ通りの動作になりました。

僕には本格的なプログラムを組めるスキルは無いので、
ファイル数は増えてもシンプルな>>952さんの遣り方でやらせて頂きます。

採用は見送らせて頂きましたが、>>953,>>954さんもありがとうございました。
わざわざサンプルを書いて下さったそのお気持ちに御礼を申し上げます。

本当に助かりました。深く感謝します。 m(_ _)m
958デフォルトの名無しさん:2011/07/23(土) 18:32:35.18
>>956
マニュアルのIO#eofのコード例では、readlinesしあとでも使えてるので、closeしてないように思うのですが、
どうでしょうか?

f = File.new("testfile")
dummy = f.readlines
f.eof #=> true

File.readlinesなら閉じるては思いますが。
959デフォルトの名無しさん:2011/07/23(土) 19:15:54.64
>>956
いや、閉じてないよ
開きっぱなしで放置してるよ
GCされるときに、閉じられるのでしょう

File.readlines() じゃなくて
File.open().readlines() してるのだから
960デフォルトの名無しさん:2011/07/23(土) 21:06:04.69
AptanaStudio3でRubyのスクリプトをCtrl+F11を押して実行すると
d:\Ruby\bin\rubyw.EXE: No such file or directory -- Studio (LoadError)
というエラーが出て実行できないのですがどうすれば良いでしょうか?
961デフォルトの名無しさん:2011/07/24(日) 07:24:39.57
たのしいRubyと初めてのRubyを読み終えたんですが,
未だにブロック,yield,Proc,Enumerableが理解できません(;´Д`)

>>2にもいくつか挙がっていますが,次に読むとしたらどの本がいいですか?
おすすめがあったら教えてくださいorz
962デフォルトの名無しさん:2011/07/24(日) 10:27:45.19
君がこれまでに書いたプログラムを挙げなさい
挙げることができないなら、それが答です
963デフォルトの名無しさん:2011/07/24(日) 10:39:49.00
まー日常たいしたことないスクリプト書いてるだけならブロックの理解もそれらの使用も必要ないからな
それだけでいいという考えかたもある
こんなん所詮プログラム言語に過ぎない
学校の勉強や試験のやり方なんて忘れろ
全部読む必要もないし全部覚える必要もない

ただ、どうしても気になるんだったら、他の誰かのプログラムを読んでみるといい
変な癖がつく可能性があるので、興味のある分野のいろんな人のをたくさん読むこと
964デフォルトの名無しさん:2011/07/24(日) 12:27:09.12
プロックとブロックとyieldは根っこ一緒な気がする
とりあえずブロックつきメソッド作るべし

使わないなら使わないでもけっこうなんとかなるので、忘れてしまうというのも手っちゃ手だ
965デフォルトの名無しさん:2011/07/24(日) 13:08:49.20
プログラミング言語Rubyがオススメ
966デフォルトの名無しさん:2011/07/24(日) 14:02:37.85
理解できません、の一言じゃアドバイスのしようが無いね。
頑張って理解してください、ぐらいしか言えない。
もう少し質問力をつけた方がいい。
967デフォルトの名無しさん:2011/07/24(日) 14:07:54.79
ブロック,yield,Proc,Enumerableの説明が詳しい本
紹介すればいいだけだろ
何が質問力だよ
968デフォルトの名無しさん:2011/07/24(日) 15:03:48.87
次の方どうぞ〜
969デフォルトの名無しさん:2011/07/24(日) 15:34:16.23
Ruby のスレのひとってどこも冷たいひとが多い
970デフォルトの名無しさん:2011/07/24(日) 16:39:25.87
>>961
>未だにブロック,yield,Proc,Enumerableが理解できません(;´Д`)

Procでは、何らかの処理をオブジェクトにできる。
data = proc {|x| puts "x=#{x}" }
data.call(123) #=> x=123

Procを使うと、メソッドの引数に処理を渡せる。
def foo(val, data)
 data.call(val)
end
foo(123, proc {|x| puts "x=#{x}" })  #=> x=123

これをスマートに書くと、yieldとブロックを使う書き方になる。
def foo(val)
 yield val
end
foo(123) {|x| puts "x=#{x}" }
971デフォルトの名無しさん:2011/07/24(日) 16:53:38.10
それから、Enumerableについては、ただの多重継承だから難しくないはず。
Enumerableが難しく思うのは、ブロックとyieldが分かってないだけ。それがわかればEnumerableもすぐわかる。

どう、わかった?>>961

>>961
ソンナコトイワナイデ!
972デフォルトの名無しさん:2011/07/24(日) 19:08:32.61
def foo(val)
 yield val
end
foo(123) {|x| puts "x=#{x}" }

fooは引数をvalだけ受け取っているのに、
なぜ、 {|x| puts "x=#{x}" }も渡されてんの?

def foo(val, *****)
みたいな書き方にならないのはなぜ?
973デフォルトの名無しさん:2011/07/24(日) 19:14:02.66
def foo(var &block)
 block.call(var)
end
という書き方あるよ
974デフォルトの名無しさん:2011/07/24(日) 20:39:43.47
>>960
・d:\Ruby\bin\rubyw.EXEはインストールされていますか?
・Rubyで実行したいファイルのパスに日本語が含まれていませんか?
・ユーザー名が日本語ではありませんか?
・Aptana3以外では動きますか?
975デフォルトの名無しさん:2011/07/24(日) 22:21:15.47
>>972
>fooは引数をvalだけ受け取っているのに、
>なぜ、 {|x| puts "x=#{x}" }も渡されてんの?
>
>def foo(val, *****)
>みたいな書き方にならないのはなぜ?

そういう文法だから。
foo(123, proc {|x| .... })
が格好悪いから
foo(123) {|x| .... }
と書けるような文法にした。それだけのこと。
976デフォルトの名無しさん:2011/07/24(日) 23:11:25.17
イテレータを実装したくてこうなったんだよね
まあうまく考えたもんだ
この二重引数構造には元ネタがあるの?
977デフォルトの名無しさん:2011/07/24(日) 23:13:49.59
そろそろ次スレ希望
978デフォルトの名無しさん:2011/07/24(日) 23:14:30.62
http://itpro.nikkeibp.co.jp/article/COLUMN/20060825/246409/

やや古い記事だけど、ここの「第5回 高階関数を分かりやすくしたブロック」でも
まつもとさん本人がrubyのブロックが成立した背景を多少語っている。
979こいけりく:2011/07/24(日) 23:34:38.68
なんか僕の悪口いってるひといました
スレみたら誹謗中傷だらけでした
やっぱりなあって思いました
7歳無職でなじられてました
2chみました 心がつぶれました
悔しくはない
980デフォルトの名無しさん:2011/07/24(日) 23:35:40.32
昔はブロックをイテレータ、と呼んでて、それはイテレータを実装する経緯で発生した機能という
歴史的経緯によったものだったんだけど、一般的なデザインパターンの用語と合致しないんで
歴史を共有してない人達には理解しがたい名前だったんで呼び方を変えた、とかそんな流れだったか
981デフォルトの名無しさん:2011/07/24(日) 23:46:41.75
>>976
イテレータの定義構文やyieldはCLUを参考にしているはず。
982デフォルトの名無しさん:2011/07/25(月) 00:24:30.39
見た目が格好悪いからって理由でヘンチクリンな構文作って
初級者その他を惑わしたあげく、何のメリットも無いとか
馬鹿じゃねーの
983デフォルトの名無しさん:2011/07/25(月) 03:00:56.40
糖衣構文否定派?
一種の過激派だな
984デフォルトの名無しさん:2011/07/25(月) 04:03:39.46
引数リストの中に直接書くとHashリテラルと紛らわしいから外に出したんでしょ
985デフォルトの名無しさん:2011/07/25(月) 07:14:51.57
LLバトロワスレでやれ
986デフォルトの名無しさん:2011/07/25(月) 07:30:37.49
>>983
内容に意味はない
レスが欲しいだけ
987デフォルトの名無しさん:2011/07/25(月) 07:55:27.41
>>972
ブロックは一番最後の引数になるのと1つしか取れないから省略可能にしたんじゃないかな?
988デフォルトの名無しさん:2011/07/26(火) 00:40:54.15
Enumerableって何て読むんですか?
エナムラブル?
989デフォルトの名無しさん:2011/07/26(火) 01:01:50.87
えにゅめらぶる
990960:2011/07/26(火) 01:13:49.06
>>974
・d:\Ruby\bin\rubyw.EXEはインストールされていますか?→されています
・Rubyで実行したいファイルのパスに日本語が含まれていませんか?→含まれていません
・ユーザー名が日本語ではありませんか?→半角英数です
・Aptana3以外では動きますか? →動きました

その状態で暫くAptana3を使っているとアウトラインウィンドウにもエラーメッセージが表示されるようになり
Aptana3を再インストールした所、エラーは出なくなりました。
原因はわかりませんでしたが解決しました。ありがとうございました。
991デフォルトの名無しさん:2011/07/26(火) 07:00:12.23
>>988
イニュマラブルじゃね?
992デフォルトの名無しさん:2011/07/26(火) 08:14:17.79
オンライン英英辞典で音声を聞けばいいんじゃないの?

Definition of enumerable on Vocabulary.com
http://www.vocabulary.com/definition/enumerable

Enumerable | Define Enumerable at Dictionary.com
http://dictionary.reference.com/browse/enumerable
993デフォルトの名無しさん:2011/07/26(火) 08:25:38.24
おなかすいた

>>988
可算名詞、などの語に使用される、ふつうの英語なので、いにゅーめらぼー(にゅにアクセント)のように読む

が、問題はカタカナ読みだな
これを名詞にした USB Enumeration という語があって、これは「ゆーえすびー エニュメレーション」とカタカナ読みする
ttp://jp.fujitsu.com/microelectronics/technical/usb/index_p8.html
なので、これを参考にするなら、エニュメラブルと読むのが妥当ってことになりそう
994デフォルトの名無しさん:2011/07/26(火) 08:58:04.80
C言語のenumをエナム、イーナム、とか読んできたからなぁ。エニュムとはあまり読まなかった気がする。
995デフォルトの名無しさん:2011/07/26(火) 09:49:34.92
enum、いにゅー↑、いにゅ↑、いぬ!、わんこ!、わんわんお!
996デフォルトの名無しさん:2011/07/26(火) 18:58:32.82
Cのenumとは別物だろw
同じ発音で言われたら逆に混乱するわ
997デフォルトの名無しさん:2011/07/26(火) 19:03:48.44
enumerate
数える、列挙する

enumeration
列挙

で、何が別物だって?
998デフォルトの名無しさん:2011/07/26(火) 19:06:27.35
Cのも略さずenumerationって発声したほうが変な風に覚えなくていいかもしれない
999デフォルトの名無しさん:2011/07/26(火) 21:50:44.03
略語なりの読み方でいいだろ
int は『イント』 char は『チャー』なんだし、enum は『イナム』でいいよ
1000デフォルトの名無しさん:2011/07/26(火) 22:36:55.36
charは「キャラ」じゃないのか?
少なくともうちの会社では「キャラ」って呼び方で統一されてる。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。