トップページ⇒tech
1001コメント355KB

Ruby 初心者スレッド Part 48

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2012/02/08(水) 06:00:47.06
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお

前スレ
Ruby 初心者スレッド Part 47
http://toro.2ch.net/test/read.cgi/tech/1322819329/


るりまサーチ (リファレンス検索)
http://rurema.clear-code.com/

Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/

逆引きRuby
http://www.namaraii.com/rubytips/
0152デフォルトの名無しさん2012/02/23(木) 22:55:03.63
まじすか
やっぱり名乗り出てtwitterで晒しあげられそうなのでやめときます
0153デフォルトの名無しさん2012/02/23(木) 23:03:42.92
>>150
ちょっと擁護しておくと、当時のRubyユーザーは、
そういう他言語知識前提のマニュアルでも理解してもらえるようなバックグラウンド持ちの人が多かったんだよ
開発の初期は尖ったユーザーがわらわら集まることが多いけど、Rubyだってそうだったのだ

今みたいに
「Rubyでプログラミング始めました!Cってなんですか放送できますか」
みたいな人がネットで独学なんて稀だったし、優先度上げてリソース割く意義が薄かった
…人員リソース管理なんてしてなかったけどな
0154デフォルトの名無しさん2012/02/23(木) 23:05:53.71
>>152
晒されても死ぬわけじゃないんだからやっちゃえYO

「本当に動く」サンプルによる補完はぜひお願いしたい
die()がRubyにあると勘違いしたPerl使いがいたのは記憶に新しい
0155デフォルトの名無しさん2012/02/23(木) 23:07:24.76
いやだってRubyのためにやって叩かれたらむかつきますしね
0156デフォルトの名無しさん2012/02/23(木) 23:50:54.35
あんまりよその言語を知らないのだけど
本格的なマニュアルを作った日本のコミュニティーってあるの?
英語マニュアルの翻訳じゃなくて

ところで
やる気がある人なら
るりまプロジェクトに参加したらいいんじゃないだろうか
人的リソースが足りてるわけじゃないだろうし
「ぼちぼちと例を増やしていく要員」とかでもいいと思うのだけど

るりまプロジェクトに「参加するには」
必要なもの¶
* Subversion
* 開発中の ruby 本体をビルドできる環境
* 1.8.x の最新のバージョンの ruby 本体 (できれば trunk を含めた全てのバージョン)
 o patch level に関しては最大のものを用意するのが望ましい
* 1.9.x の最新のバージョンの ruby 本体 (できれば trunk を含めた全てのバージョン)
なんかハードル高いな

るりまプロジェクトに「貢献するには」
ドキュメントの誤り・改善点を指摘する¶
issues からチケットを登録してください。チケットを登録する際、アカウントが必要になりますが誰でも取得可能です。 (プロジェクトメンバに登録して欲しい場合は ML で報告してください。)
* ドキュメントの単純な誤り指摘 (バージョン間違いなど)
* ドキュメントをよりよくするための提案 (説明文追加など)
* あるメソッドのサンプルコード提供
* 既に上がっているチケットに対するコメント
こっちかな
01571422012/02/24(金) 08:52:42.08
>>145
ありがとうございます。
4,6,8行目が理解できていませんが、やりたいことはやれそうな気がします。

ちなみに、昨日作っていたプログラムは、あの後ハッシユと配列で作ってみました。
ハッシュのキーを指定するところが少しまどろっこしく感じましたが、
以外と簡単にできました。
0158デフォルトの名無しさん2012/02/24(金) 10:38:33.13
俺はPHP並みのマニュアルを作りたい
0159uy2012/02/24(金) 17:18:44.88
>>128 一般人にはこういう発想はないんだろうが、
その手の小さな計算は、こうやって定義を増やしていって暗記する
人のスペックが上がれば使えるようになる

v1 = 0
v2 = 8
v3 = 3

def ifltnlt a , b
  return yield if a > b 
  a
end


v1 =
if v2 > v3 
  v2 - v3 
else
  v2
end

p v1

a = ifltnlt v2 , v3 do
  v2 - v3
end
p a
   

ゲームなどで、Mobなどのパターンを大量に作らなければならないような処理の場合
ソースコード効率を求めたらこういうのばかりになってくる
0160デフォルトの名無しさん2012/02/24(金) 19:05:20.43
ruby1.9.3で勉強をしたいのですがredmineも使ってみたい
なのでruby1.8.7も一緒にインストールしたい
Windowsでこういう悩みを解決する方法を教えてください
0161デフォルトの名無しさん2012/02/24(金) 20:28:22.97
最近redmineの1.9対応がものすごく進んだと聞いた気がする。
0162デフォルトの名無しさん2012/02/24(金) 21:47:03.78
>>160
別の場所にインストールすれば共存できるんじゃない。

Redmineからforkしたものとして、ChiliProjectというものがあるね。
これは1.9.3対応。
https://www.chiliproject.org/
どの程度安定しているかは知らない。
0163デフォルトの名無しさん2012/02/25(土) 12:57:15.84
Perlでいう map {$_ => 1} @a のようなことをRubyでやるのに
h = {}; a.each {|x| h[x] = true }
はhを2回書く必要があってエレガントでないし
a.inject({}) {|h, k| h[k] = true; h }
Hash[*a.map {|x| [x, true] }.flatten(1)]
とかだと分かりにくいんですが、何かいい方法ないでしょうか。
Hash#to_aでalistに変換されるのだから、
a.map {|x| [x, true] }.to_hash
のように、Array#to_hashでalistをHashに変換してくれるといいなと思うんですが。
0164デフォルトの名無しさん2012/02/25(土) 13:45:01.28
>> RUBY_DESCRIPTION
=> "ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin11.3.0]"
>> a = %w(a b c d e f g)
=> ["a", "b", "c", "d", "e", "f", "g"]
>> Hash[a.map{|x|[x,true]}]
=> {"a"=>true, "b"=>true, "c"=>true, "d"=>true, "e"=>true, "f"=>true, "g"=>true}
01651632012/02/25(土) 14:20:08.01
>>164
おお、Hash[] に直接alistを指定できるんだ!長年の不満が解消されたよ。ありがとう!
ちなみにリファレンスマニュアル見たら一応書いてあった。
http://doc.ruby-lang.org/ja/1.9.3/class/Hash.html
self[*key_and_value] -> Hash の(4)に書いてあったけど、
self[other] -> Hash のところに書くべきだろこれ。
0166デフォルトの名無しさん2012/02/25(土) 15:02:04.78
rubyでwebアプリをつくろう思うんだけど hamlつかってやる際参考なるサイトありますか?
0167デフォルトの名無しさん2012/02/25(土) 15:23:07.32
書いてある順番がおかしいんだろうな
先にkey_and_valueのことが書いてあればわかるが、最初にあると何に対してotherなんだって感じ
0168デフォルトの名無しさん2012/02/25(土) 15:43:40.70
>>161
まじっすか
でもぐぐっても対応してる情報が見つかりません

>>162
これいいですね
0169デフォルトの名無しさん2012/02/25(土) 16:03:22.38
>>168

http://forza.cocolog-nifty.com/blog/2012/02/redmine140ruby1.html

対応するのは1.4だろうね。
0170デフォルトの名無しさん2012/02/27(月) 14:48:36.31
Emacsで上で使うとなんかすっごいRubyプログラミングが便利になる定番プログラムとかライブラリとかありますか
0171デフォルトの名無しさん2012/02/27(月) 19:00:03.50
>>170
1:あります
2:初心者丸出しの奴にそんなもの教えても意味ねえよ
3:条件によるだろアホか
どれがいい?
0172デフォルトの名無しさん2012/02/27(月) 19:07:09.26
1かつ具体的に詳しく
0173デフォルトの名無しさん2012/02/27(月) 20:56:03.21
eclipse使えばいいよ。
0174デフォルトの名無しさん2012/02/27(月) 21:44:01.66
ruby1.9.2を使っています。

文字置換について教えて下さい。

文字コードが全てutf-8で扱っている前提で

org = "第1回"
temp = org.gsub(/第(.+)回/,"\1")

として"1"だけを取り出したいと考えています。
ところが上記を実行すると、
"1"と入って欲しい所が
tempは"\u0001"となります。

どうすれば"1"として取り出しできるでしょうか。

0175デフォルトの名無しさん2012/02/27(月) 21:59:40.06
たまたま1だったから分かりづらいのかもしれないけど、
"" の中のバックスラッシュエスケープ記法として解釈されてる。
'' の中なら ' と ¥ 以外のエスケープは解釈されず、置換結果文字列記法における ¥1 になる。
つーか置換にはブロック使え。
0176デフォルトの名無しさん2012/02/27(月) 22:16:19.56
なんでgsubの第2引数使う人がいるんだろう
どっか本にでも書いてあるんだろうか
燃やすから教えろ
0177デフォルトの名無しさん2012/02/27(月) 22:18:20.03
ありがとうございます、おかげさまで理解できました。

ブロックを使うというのは、今回の例でいくと
temp = org.gsub(/第(.*?)回/) {$1}
となる訳ですね。
これなら""の誤りも確かにでにくいですね。
01781742012/02/27(月) 22:21:43.21
>>176
ググルで
「ruby 文字列 置換」
で検索してトップのほうにでるサイトのいくつかは、第二引数で使用しているもので
それがスタンダードなのだと思っていました。
0179デフォルトの名無しさん2012/02/27(月) 22:47:47.59
うんにゃ、subとgsubの第2引数は通常使用しない
代わりにブロックを使う(ブロックの最後の返り値で置き代わる)
他の言語で一般的な「ばっくすらっしゅ1」という記法を許容するために
(または、「ばっくすらっしゅ1」ではなくバックスラッシュに続く数字1だと書くために)
めんどくさい書き方をしなければならないので人気がない

irb> s = "第76回"
irb> puts s.gsub(/第(.+?)回/,"\\1")
76
0180デフォルトの名無しさん2012/02/27(月) 22:54:45.74
そんな嘘吐かずに個人的には非推奨とだけ言えばいいのに

http://www.koders.com/default.aspx?s=gsub&search.x=0&search.y=0&la=Ruby&li=*&scope=
0181デフォルトの名無しさん2012/02/27(月) 23:19:15.96
http://rurema.clear-code.com/1.9.3/method/String/i/sub.html

一応るりまには、第2引数で$1, $2, $3...や\を使う時は注意が必要だから
間違いを避けて可読性を上げるためにブロック付きのsubやgsubを使うべきとは書いてるな。

$1とか\が絡まなきゃ第2引数使ってもよくね?わざわざブロック作るのも面倒だし
というのは俺の個人的な意見。
0182デフォルトの名無しさん2012/02/27(月) 23:43:34.76
スレ的には「そもそも第2引数はないもんだと思って覚えてもらう」がベストだと思うがねえ
書くときにあらゆるものに注意して書けるくらいなら世の中からバグはもっと減っていてもいい
0183デフォルトの名無しさん2012/02/27(月) 23:46:05.33
じゃあそういう仕様にしろよカス
0184デフォルトの名無しさん2012/02/28(火) 00:00:43.41
無理
>>179の言う通り、\2などの「バックスラッシュと数字」を文字列リテラルで指定するためには第2引数のような仕様が、
文字列リテラルとして指定しない方法としてはブロックで $1 のように記述できる仕様が、どちらも必要

っていうか、第2引数がめんどくさ過ぎるからブロックで書けるようにしたんじゃなかったっけ
まあめんどくさいんだけど、将来マッチつき置換に書き変えるときにうっかりバグ仕込むよりはマシかと考える
0185デフォルトの名無しさん2012/02/28(火) 00:19:58.36
g?subの第二引数を使ってる標準ライブラリは教育的観点から一度標準から外すべき
さあgrepしてみよう
0186デフォルトの名無しさん2012/02/28(火) 07:28:33.81
ここまでのまとめ

gsubメソッドとgsub!メソッドは、文字列の中で正規表現のパターンにマッチした部分をすべて指定の文字列に置換します。

文字列で置換
str.gsub(pattern, replacement)
Ruby 1.9では、パターンの中で(?<名前>パターン)という形でカッコに名前を付けられます。第2引数replacementの中では、\k<名前>という書式でそのカッコに当てはまる部分を埋め込めます。
s = "one two, three four, five six"
puts s.gsub(/(?<first>\w+)\s+(?<second>\w+)/, '\k<second> \k<first>')

ハッシュで置換
Ruby 1.9 Ruby 1.9では、第2引数に{ マッチした文字列 => 置換文字列 }のようにハッシュを指定できます。次の例は、文字列中の< > & "をHTMLの文字参照に置き換えています。
s = '<hello> & "world"'
puts s.gsub(/[<>&"]/,
"<" => "<", ">" => ">", "&" => "&", '"' => """)

ブロックを使った置換
str.gsub(pattern) {|match| block }
s = "hello, world"
puts s.gsub(/\w+/) {|word| word.capitalize }
0187デフォルトの名無しさん2012/02/28(火) 07:46:00.03
>>174
いまさらだけど
そもそもの要求が置換じゃないんだからgsubを使うのが間違い
マッチした部分を取り出したいだけならslice,[]の方がいい

temp = org[/第(.+?)回/,1]

それとマッチさせるのが数字限定なら.よりも\d
上の場合は漢数字とか全角とかあるかもしれんけど
0188デフォルトの名無しさん2012/02/28(火) 16:11:10.74
多倍長整数(Bignum、符号なし)をArray#pack("Q")によりパックした文字列を
他のマシン(Windows、32ビット環境)で動作するrubyプログラムに送信したとします。

このとき、受信した文字列をString#unpack("Q")で変換するのは危ないですかね?
Cのlong longのサイズに依存しているということは、相手の環境によっては正しく変換されない可能性もあるんですよね・・・。
rubyは多倍長整数が扱えるので、何とかして環境を意識せずに扱いたいのです。

じゃぁ、整数をテキストとして送信すればいいじゃないか、と思われるかもしれませんが
事情により固定長のデータで送らなければならないのです。
0189デフォルトの名無しさん2012/02/28(火) 19:14:45.10
どんな事情かを語らずにそんなクイズみたいなことされてもなぁ。
0190デフォルトの名無しさん2012/02/28(火) 19:25:50.40
packとunpackは「同じマシン」でやることが前提
なんとなくunpackするだけでどんなマシン由来のデータも元に戻るなんてことはない
送信プロトコルや事前外部人力情報で相手の環境が知らされないのだとしたら、どうしようもないかもしれない
0191デフォルトの名無しさん2012/02/28(火) 22:30:50.66
るりまのpackフォーマットより
システムに依存しないデータを扱うときには n, N, v, V を用います。
エンディアン非依存、整数サイズ非依存 (ネットワークプロトコルなどに適切)
n: big endian unsigned 16bit
N: big endian unsigned 32bit
v: little endian unsigned 16bit
V: little endian unsigned 32bit

これの64bit版があればいいのにね

今のところ、自前で32bit 二つにするしかないんじゃない
ll = 12345678901234567890
u = (ll >> 32) & 0xFFFFFFFF
l = ll & 0xFFFFFFFF
data = [u,l].pack('NN')
ll2 = data.unpack('NN').inject{|r,x| (r<<32)+x}
p ll2 # => 12345678901234567890
p ll == ll2 # => true
0192デフォルトの名無しさん2012/02/28(火) 22:40:46.94
Q> と Q< は?
0193デフォルトの名無しさん2012/02/29(水) 00:05:39.77
そんなものがあったとは
Ruby 1.9.3 でエンディアン指定が追加されたのか

ll = 12345678901234567890
data = [ll].pack('Q<')
ll2 = data.unpack('Q<').first
p ll2 # => 12345678901234567890
p ll == ll2 # => true
0194デフォルトの名無しさん2012/02/29(水) 01:21:06.83
文字列を連結する場合に、
a = a + b
a << b
後者が圧倒的に速いようです

原因としては、前者だと新しいオブジェクトが作られていしまい、後者だと作られないからという理解でいいでしょうか?
0195デフォルトの名無しさん2012/02/29(水) 02:20:42.12
よろしいです
まあ、速度差が出るなんてよっぽどだけど…
本質的には別個の動作であり、どっちかがどっちかの代わりになるものではないです(本当は)

なお a << b << c は単に a.concat(b).concat(c) であり、b は変化しません
irb> a, b, c = 'A', 'B', 'C'
irb> a << b << c
irb> p a
"ABC"
irb> p b
"B"
これが "BC" になると思ってる人が時々いますが、後ろから処理しそうな見た目に惑わされず前からメソッドチェーンとして考えて下さい
0196デフォルトの名無しさん2012/02/29(水) 09:25:03.86
>>195
なるほど、勉強になるなあ。
func(a << b , b << c , c << a) だと左から順に評価されるので
a << b << c も同様だと、つい考えそうになる。
0197デフォルトの名無しさん2012/02/29(水) 09:47:03.34
>>196
a << b << c という形式は、擬似的に書けば「a.<<(b).<<(c)」なんよ
んで、基本的に<<は処理後のa自身を返すのがマナーなんで
ずっとaに対する処理となる

…一応仕様上は<<が自身以外のものも返すことは出来るが
混乱させるだけなので基本やらない
0198デフォルトの名無しさん2012/02/29(水) 11:21:19.51
>>197
>…一応仕様上は<<が自身以外のものも返すことは出来るが

できないんじゃないかなあ。
def <<(x); return "not self"; end
とかしても、Rubyのパーサが「<<」の戻り値を無視して、戻り値としてreceiverを強制的に使うようになってるはず
0199デフォルトの名無しさん2012/02/29(水) 11:48:12.61
Rubyerって何でPHPに敵対心むき出しなの?
どんだけだよ
ttp://j.ktamura.com/archives/1944
0200デフォルトの名無しさん2012/02/29(水) 12:00:59.76
>>198
1.8.6では強制的にreceiverが戻り値になることはないようだ。
http://codepad.org/bifkv52L

手元のruby 1.9.3p125でも同様の結果だった。
0201デフォルトの名無しさん2012/02/29(水) 15:01:01.55
>>199
そのページ主がRubyer?で、世界中のRubyユーザを代表していると?
0202デフォルトの名無しさん2012/02/29(水) 16:10:37.89
>>199=>>201
0203デフォルトの名無しさん2012/03/01(木) 17:25:32.12
Rubyerって初めて聞いた
0204デフォルトの名無しさん2012/03/02(金) 00:14:55.29
ちなみにRugbyはラグビーな
0205デフォルトの名無しさん2012/03/02(金) 00:16:28.85
↓絶妙なオチでこの話題を終わらせてくれ
0206デフォルトの名無しさん2012/03/02(金) 09:10:07.04
うんこ
0207デフォルトの名無しさん2012/03/02(金) 13:09:43.46
Ruby UserでRuserってのはどうだ

決してLoserではない
0208デフォルトの名無しさん2012/03/02(金) 13:46:45.56
PHPって主にwebで使われてるじゃないですか
Rubyは主にどの分野で使われているものでしょうか?
0209デフォルトの名無しさん2012/03/02(金) 14:05:09.25
主に「外に出ない」部分で使われてます
賄い料理みたいな分野と言えばなんとなくわかってもらえますかぬ

毎日の賄い料理が便利に作れたり美味しく作れても客に出すメニューに載ることはまず無いが、
客に出すメニューの内容が賄い料理の経験で良い方向に変化することはありえるし、
「ただいま食事中」で店が長時間止まるようなこともなく、マズい昼食で料理人のテンションが下がることもない
0210デフォルトの名無しさん2012/03/02(金) 15:09:12.43
それは例えばLinuxでシェルスクリプトを書くのに使われるとか
受信したメールを処理するなどの内部で処理するシステムを書くときに使われるってことでしょうか?
0211デフォルトの名無しさん2012/03/02(金) 15:38:43.32
http://www.google.co.jp/search?num=30&hl=ja&q=ruby+%8E%96%97%E1&btnG=%E6%A4%9C%E7%B4%A2&lr=
0212デフォルトの名無しさん2012/03/02(金) 15:43:01.17
>>210
シェルスクリプトを知っているのなら、それのベターな代替位置だと思ってもらっていい
あなたやわたしが手元で作ってせいぜい10人が手元で使うもの
会社のサーバのcronで毎日ぐりぐり動いてるよくわからない何か
動作を書きなおすことはあっても、パフォーマンス計測して速度をチューニングされることはないようなプログラム
あとで絶対にCで作り直すからと言われつつも絶対にそのまま使われるプログラム

昔のPerlのようなもの(CGI用途?違うもっと前だ)という例えがどのくらい伝わるもんなのかよくわからん
キラキラしてテカテカした画面ができたり電気屋に箱がうず高く積まれたり雑誌の一面を飾ったりするようなサービスはできないが、
文房具のようにないと困るプログラムの作成言語
つまり糊
0213デフォルトの名無しさん2012/03/02(金) 16:34:16.23
でも実際は、ちょっとした雑務処理をrubyで書くことはあまり無いよな。
シェルスクリプトの方が、汎用性あるし読める人が多いし。
わずかな作業効率と自己満のためだけにrubyで書くってのも馬鹿らしい。エンジニアとして糞
0214デフォルトの名無しさん2012/03/02(金) 16:59:05.11
同一のIOを複数のスレッドが弄るとどうなりますか?

require 'socket'
sock = TCPSocket.open 'localhost', 80
t = Thread.start { loop { sock.write "HELLO" } } # 永遠に書き出す
loop { sock.read 4096 } # 永遠に読み出す
t.join
sock.close
0215デフォルトの名無しさん2012/03/02(金) 17:40:42.73
iCORE7とか結構いいCPU積んでるパソコンを持ってる人に伺いたいんですが
Rubyのコンパイルってどのくらい時間がかかりますか?
自分のはセレロンなんですけど2時間かけても終わりません
速度が速くなるならパソコンの買い替えをしたいんですが
0216デフォルトの名無しさん2012/03/02(金) 17:53:45.39
「シェルスクリプトで書ける」分野というのはそんなに広くはない
sedやawkとかの外部コマンド使いだしたらそれは「読みやすいシェルスクリプト」としての意味はないし、
シェル組み込みだけで書くなんて面倒にも程がある
一部LinuxディストリビューションでPythonがメインスクリプトとして採用されたのには理由があるってことだな
まあ、別にいいけど
0217デフォルトの名無しさん2012/03/02(金) 18:00:22.38
>>214
ぐちゃぐちゃになります

>>215
20分くらい?
コンパイル仕事にしてるんでなけりゃ別に無理してまで買う必要はないとは思うが
02182142012/03/02(金) 18:13:12.63
>>217
マジで?
TCPのIOでもダメなんだ、やべぇな。。書き直しだ
0219デフォルトの名無しさん2012/03/02(金) 18:13:58.00
コマンドを順々に実行するならシェルスクリプトが最強効率だけど、
自前でデータ持つとかになると途端に…
0220デフォルトの名無しさん2012/03/02(金) 18:29:29.90
>>219
bash4では連想配列が使えるぞ
まあ、bashでシェルスクリプト書く奴はいないとは思うんだが
0221デフォルトの名無しさん2012/03/02(金) 19:07:07.87
>>218
ソケットは受信用と送信用のバッファ持ってるから
受信または送信を行うのがひとつのスレッドだけなら問題ないよ

ただ受信バッファがカラならreadはブロックするし
送信バッファが満杯ならwriteはブロックする
0222デフォルトの名無しさん2012/03/03(土) 03:42:09.06
>>215
さすがに2時間もかかってコンパイル終わらないようだと買い換えた方が良いのでは。
今はパソコンも安いし。
ちなみに手元のマシンだとconfigureから始めて4分くらい。
(rubyのバイナリ作るだけなら一瞬だけど。)
0223デフォルトの名無しさん2012/03/03(土) 04:31:31.08
セレロンは糞
0224デフォルトの名無しさん2012/03/03(土) 12:25:56.34
そうですか
やっぱ新しいの買おう
最近のスペックのは5万でもいいのあるし買っておきます
0225デフォルトの名無しさん2012/03/03(土) 12:31:18.61
3万程度で自作しろ
0226デフォルトの名無しさん2012/03/03(土) 12:34:41.11
福岡のルビービジネス広がる 参加企業5年で8倍に
http://www.nikkei.com/news/local/article/g=96958A9C93819891E2E3E2E2EA8DE2E0E2E1E0E2E3E09E8AE2E2E2E2;n=9694E3E4E3E0E0E2E2EBE0E0E5E2
0227デフォルトの名無しさん2012/03/03(土) 13:15:24.06
日経が記事にしたってことはそろそろ終息ですな
0228デフォルトの名無しさん2012/03/03(土) 16:23:07.10
<div>
<div class="test">aaaaaaaa</div>
<div class="test">bbbbbbbb</div>
</div>
上のHTMLの2番目のテキストbbbbbbbbを取得したくてXPathを利用してこう書きました
require "rexml/document"
include REXML
doc = Document.new File.new("test.xml")
result = XPath.first(doc, "//div[@class='test'][2]")
print result.text
これで取得はできるのですが以下のような構造だと取得できません
<div>
<div class="test">aaaaaaaa</div>
<div class="a">
<div class="test">bbbbbbbb</div>
</div>
</div>
HTMLの構造が分からないのでピンポイントで//div[@class='test']という書き方で取得したいのですが
//div[@class='test'][2]で取れません
どなたかご教示お願いいたします
0229デフォルトの名無しさん2012/03/03(土) 16:36:05.93
//div[@class='test']な要素を最初のひとつだけではなく
全部返してくれるメソッドがあればいいわけだけど
チュートリアル見た限りではXPath.matchが使えそうだよ

doc = Document.new File.new("test.xml")
result = XPath.match(doc, "//div[@class='test']")
p result[1].text
0230デフォルトの名無しさん2012/03/03(土) 16:40:47.55
勉強になりました
無事取れました
ありがとうございます
0231デフォルトの名無しさん2012/03/04(日) 12:01:19.82
WindowsにRubyインストーラーで配布されているexeかzipから入れようと思います
zipから入れた場合は自分で環境変数を追加しますが
それ以外にすることはありますか?
インストーラーで入れるとアンインストールしてからインストーラー立ち上げるのが面倒くさかったり
複数のバージョンを切り替えるのが面倒くさいのでzipから入れたいと考えてます
C:\rubyにパスを通して、1.8.7と1.9.3をフォルダ名を切り替えて利用したいため
0232デフォルトの名無しさん2012/03/04(日) 12:38:26.77
あとは関連付けくらいか
0233デフォルトの名無しさん2012/03/04(日) 12:47:00.72
関連付けってしてないのですがしないとダメですか?
rbファイルはテキストエディタに関連付けはしてます
実行するときはコマンドプロンプトからおこないます
0234デフォルトの名無しさん2012/03/04(日) 19:26:48.42
俺もそうしてる
ダブルクリック時はテキストエディタで開いて編集
どう考えても実行する回数より編集する回数のほうが多いから(あくまでも俺の場合
0235デフォルトの名無しさん2012/03/04(日) 20:03:40.17
& # 12487 ; & # 12473 ; & # 12494;

↑こういう文字列を日本語に変換できますか?
0236デフォルトの名無しさん2012/03/04(日) 20:27:57.24
楽にやるなら CGI.unescapeHTML(s)
まじめにやるなら数値抜き出して pack('U')
0237デフォルトの名無しさん2012/03/04(日) 22:32:49.52
ありがとうございます
#!/usr/local/bin/ruby -Ku書いて、CGI.unescapeHTMLでできました。
0238デフォルトの名無しさん2012/03/05(月) 00:11:15.44
Rubyスクリプトの実行はコマンドプロンプトやファイラーからだけで
エクスプローラーをまったく使ってないので
関連付けとかいらないんだけど

適切に関連付ければ
拡張子rbをbatファイルみたいな実行可能ファイルみたいに扱えるようになったりする

デフォルトが「エディタで開く」だと
コマンドプロンプトでスクリプト名だけ書いてもエディタで開いちゃう
デフォルトが実行するやつになってると
hoge.rb foo bar
で実行できる
環境変数PATHEXTに.rbを追加すると、拡張子無しの
hoge foo bar
で実行できる
0239デフォルトの名無しさん2012/03/05(月) 06:59:19.26
ruby 1.9.2p136 (2010-12-25 revision 30365) [i386-mswin32]でMS Excelで出力したcsvファイルを処理しようとしているのですが,

require 'csv'
CSV.foreach("hoge.csv", 'r') do |row|
p row
end

としても
C:/ruby/lib/ruby/1.9.1/csv.rb:1198:in `delete': can't convert Symbol into String (TypeError)
と表示され,うまくcsvファイルが読み込めません。

webで検索して 'r' を 'r:sjis' としてみたり,元のcsvファイルを utf-8 に変換してみたりしても状況は変わりませんでした。

csvファイルのの扱い方など教えていただけないでしょうか。
0240デフォルトの名無しさん2012/03/05(月) 18:16:53.46
>C:/ruby/lib/ruby/1.9.1/csv.rb:1198:in `delete': can't convert Symbol into String (TypeError)
0241デフォルトの名無しさん2012/03/05(月) 20:52:16.32
>>239
'r' は不要というかそこにStringは来ない。エンコードを指定したい場合は、
CSV.foreach("hoge.csv", encoding: "shift_jis")

> foreach(path, options = Hash.new, &block)
> ...
> The options parameter can be anything CSV::new() understands. This method
> also understands an additional :encoding parameter that you can use to specify
> the Encoding of the data in the file to be read.
0242672012/03/05(月) 21:09:32.25
>>67
>f = File.Open("hoge.dat", "rb")
>
>data_array = f.Read(16)

今更質問の追加ですいません。。
上記のように、バイナリファイルを16Byte読み出し、

puts data_array[0]

とすると、データが化けてしまいます。

もちろん
data_array.each_byte{ |num|
print num
}
とすると、うまくデータは取得できます。

配列要素を取得するにはどうすればいいのでしょうか?
テキストファイル制御のサンプルは多いのに、
バイナリデータを取り扱うサンプルは少ないなあ。。
0243デフォルトの名無しさん2012/03/05(月) 21:15:39.14
まあ>>68の回答が思いつく限り最悪だったからな
0244デフォルトの名無しさん2012/03/05(月) 21:51:30.93
相変わらず質問のしかたがまずいですねぇ
「データ化ける」だけではよくわかりません
〜になって欲しいのに
〜になります
というように具体的に書いてもらわないと
それと、RubyのバージョンとかOSとかも書くといいでしょう

Ruby1.9以降だと想像すると
puts data_array[0]
は、data_arrayの先頭1バイトの「文字」を表示しますよ

puts data_array[0].ord
だとどうですか?
0245672012/03/05(月) 22:00:47.88
質問の仕方がまずくてすいませんでした。

rubyは1.9.2です。

やりたいことは、
「ファイルの先頭から数バイト、バイナリデータとして読み出して、
配列に格納し、先頭要素の値が所望の値、例えば0x0Aだったら、次の処理へ、、
という逐次処理をしたいと思ってます。

そのために、まずはファイルから読み出したデータがちゃんと配列に格納されたか、
チェックしたくて、putsコマンドで確認していました。
0246デフォルトの名無しさん2012/03/05(月) 22:05:34.61
Ruby 1.8でも動かす可能性があるなら

data_array.bytes.to_a[0]
data_array.unpack("C16")[0]

という手もある。
バイナリファイルを扱うならunpackはほぼ必須だろう。
0247672012/03/05(月) 22:34:40.65
ありがとうございます!

ファイルから取得した配列は、バイト単位の要素になってるわけじゃないんですね?

文字単位?

だから、希望の単位に分割させるためにunpackを用いる、という理解でいいんですかね。

unpack、packの使い方をちゃんと理解しないといけませんね。
0248デフォルトの名無しさん2012/03/05(月) 22:56:06.08
>>67
f.readの返り値はArrayではなくStringなのでdata_arrayという変数名は混乱の元。
unpackはStringをArrayに変換するメソッド。
data_array[0] の [] はArrayではなくStringに対するメソッド。Ruby 1.8と1.9で動作が違う。
0249デフォルトの名無しさん2012/03/06(火) 13:59:52.09
rubyをはじめてみようと思ったのですがバイナリを落とせません。
ここの 1.9.2 i386 (32bit)というバイナリなのですが。
http://www.garbagecollect.jp/ruby/mswin32/ja/download/release.html
0250デフォルトの名無しさん2012/03/06(火) 14:01:01.31
宣伝うぜえ
今はRubyInstallerの時代だろうが
0251デフォルトの名無しさん2012/03/06(火) 16:28:37.86
Ruby 1.9.2を使っています。下のコードをもっと短く書く方法はないでしょうか?
notebook = notebooks[notebooks.index{|n| n.name == "目的のノートブック" }]
notebooksが二度出てきてしまうのが気になります・・・
0252デフォルトの名無しさん2012/03/06(火) 16:35:49.97
notebooks.find{|n| n.name == '...' }
■ このスレッドは過去ログ倉庫に格納されています