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

Ruby 初心者スレッド Part 52

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

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

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

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

逆引きRuby
http://www.namaraii.com/rubytips/
0449デフォルトの名無しさん2013/09/14(土) 08:45:57.52
うゆ = >>438です

自己解決していません
socksプロキシに対応したプロキシ立てをrubyでやりたいんですけどわかりません
ちなみにsshでのsocksプロキシはやりたくないんです
ssh以外の方法でrubyでsocksプロキシに対応したプロキシサーバ作りたいんですけど
0450デフォルトの名無しさん2013/09/14(土) 11:17:18.83
自己解決しました
0451デフォルトの名無しさん2013/09/14(土) 13:10:04.19
includeとrequireの違いってなんですか?
0452デフォルトの名無しさん2013/09/14(土) 13:21:11.16
え?
0453デフォルトの名無しさん2013/09/14(土) 13:59:05.54
rubyカンファレンスっていうのはないんですか?
0454デフォルトの名無しさん2013/09/14(土) 15:15:51.75
RubyConf2013 なら 11/8-10 舞浜^H^Hマイアミビーチで開催される。
0455デフォルトの名無しさん2013/09/14(土) 18:02:07.46
Rubyの2.0ソースコードってデュアルライセンスですよね
ソースコードの勉強として、1ブロック(10〜20行ぐらい?程のコードをブログにアップして解説する場合は
ライセンスを明記し解けばいいのですか?
0456デフォルトの名無しさん2013/09/14(土) 18:14:26.44
>>455
それぐらいなら引用の範囲内じゃね?
0457デフォルトの名無しさん2013/09/17(火) 12:55:23.03
watirでファイルのアップロードをしたいんですがうまく動きません
http://linux.ohwada.jp/modules/smartsection/item.php?itemid=452
ここに書いてあるのを試したりもしたんですが、
英語環境じゃないと動作しないんでしょうか?
0458デフォルトの名無しさん2013/09/17(火) 13:13:16.24
「よくわかんないけど動きません」は禁止です

HTMLとJavascript(とCSS)が読めるのなら、
そのサイトでWebブラウザがどういう順を追ってアップロードをしているのかを確かめて、
それの通り(または、飛ばしても動く面倒な部分は飛ばして)動作するように記述すればいい

HTMLとJavascript(とCSS)が読めない場合は現実的にちと無理
今回のように「なんだかわからないけど動かない」なんてなったときにどうしようもできない
HTMLとJavascriptを大雑把にでも読み解けるくらいの知識が別途必要
0459デフォルトの名無しさん2013/09/17(火) 13:28:56.99
ボタン押したりクリックするだけでページが遷移する、みたいなシンプル動作なサイトなら
全くなにも知らなくてもうまくいくことが多いんだけどねWatir
0460デフォルトの名無しさん2013/09/18(水) 10:35:49.02
Rubyist壊滅のお知らせ
http://kohada.2ch.net/test/read.cgi/php/1375636484
0461デフォルトの名無しさん2013/09/18(水) 11:13:42.88
PHPスレからこちらに来てあっちの民度の低さが露呈して発狂しそう
0462デフォルトの名無しさん2013/09/18(水) 16:21:17.29
attr_reader や attr_writer にて指定した変数を取得する
メタクラス(?)の記述方法は有りませんか?
下記のプログラムにて,a.a a.b を知らなくても
その変数名リストとその値をそれぞれ取得出来るような方法です.

class AA
 attr_reader :a, :b
 def initialize( )
  @a = 1
  @b = 2
 end
end
a = AA.new
printf "%5d%5d\n", a.a, a.b
0463デフォルトの名無しさん2013/09/18(水) 17:13:41.97
attr_readerとかを書き換えちゃえばいいじゃん
0464デフォルトの名無しさん2013/09/18(水) 17:47:56.55
>>462
def attr_values(obj)
  obj.instance_variables.inject({}) { |hash, at_sym|
    symbol = (at_sym.to_s)[1..-1].to_sym
    result, value = begin
               [true, obj.method(symbol).call]
             rescue
               [false, nil]
             end

    if result then hash.merge symbol => value else hash end
  }
end


class AA
  attr_reader :a, :b

  def initialize
    @a = 1
    @b = 2

    @c = 3
  end
end

a=AA.new
p attr_values(a) # => {:a=>1, :b=>2}
04654622013/09/18(水) 19:06:20.27
>>463-464
有難うございます〜.とても助かりました.
この短いコードから色々試して勉強出来ました.
0466デフォルトの名無しさん2013/09/19(木) 12:44:28.74
Pythonで作られた有名なサービスはDropboxですが
Rubyで有名なものを教えてください
0467デフォルトの名無しさん2013/09/19(木) 14:37:31.39
>>466
前のTwitter
0468デフォルトの名無しさん2013/09/19(木) 14:53:27.47
>>458
あなたはwatir使った事がありますか?
レスが全く無関係の方向です

分かる人いなそうなので回答は結構です
0469デフォルトの名無しさん2013/09/19(木) 14:55:30.13
なるほど
ということは今はRubyで作られた有名なものはないのですよね
ぼくがRubyですごいやつ作ったら有名になれる気がしました
0470デフォルトの名無しさん2013/09/19(木) 15:13:41.55
>>469
Rubyでなくてもすごいの作ったら有名になるだろ。特にサービスは実装関係ないから、Rubyでなくなったんだろ。
アプリならredmineとか。
0471デフォルトの名無しさん2013/09/19(木) 16:35:35.68
基礎がなってないって事実を指摘するとキレる人は多い
0472デフォルトの名無しさん2013/09/19(木) 16:36:14.37
Githubは?

Twitterも一部にRailsが残ってるとか
0473デフォルトの名無しさん2013/09/19(木) 16:41:28.36
どのくらいのレベルに達したらまつもと先生にTwitter follorされるのでしょうか?
0474デフォルトの名無しさん2013/09/19(木) 16:49:29.69
まあ基礎がなってなくても人間としてなってないとかいろいろあるからな
喧嘩すんなって感じではあるが
0475デフォルトの名無しさん2013/09/19(木) 17:35:21.38
日本だとcookpadが有名だろう
0476デフォルトの名無しさん2013/09/20(金) 20:08:54.85
Ruby 2.0.0

ary = [1,2,3]
ary.each do |v|
p v
end

のとき
ary[0]
ary[1]
ary[2]
の0と1と2の部分Keyていうですか?これを取得する方法を教えてください

ググって
ary = [1,2,3]
ary.each do |key, v|
p v
end
でできるみたいな記事も見つけたのですが
keyには値が入ってて、vはnilだったのでダメでした
0477デフォルトの名無しさん2013/09/20(金) 20:26:19.24
ary.each_index do |key|
p key
end
って書くと key が 0 から 2 まで回る。
これで要求に答えられてるかわからんけど。
0478デフォルトの名無しさん2013/09/20(金) 20:38:18.78
>>476
#each_with_index
0479デフォルトの名無しさん2013/09/20(金) 21:07:51.49
irb(main):001:0> ary = [1,2,3]
=> [1, 2, 3]
irb(main):002:0> ary.each.with_index do |v, index| p [v, index] end
[1, 0]
[2, 1]
[3, 2]
=> [1, 2, 3]
irb(main):003:0>
0480デフォルトの名無しさん2013/09/20(金) 23:42:14.44
とあるログを解析するのに、キーとなる文字列を抽出するのにmatchメソッド使ったけど、これだとmatchオブジェクトになるんだな。
これをハッシュのキーにすると、文字列としては同じに見えるのに、異なるキーとして扱われるので、気付くのに時間が
かかった。見た目同じ文字列が、見えないところで違う扱い、それも基本的なデータ型で、初心者に優しくないよね。
というか慣れた人でもハマることありそう。
なんでこんな設計になってるの? Rubyって。
0481デフォルトの名無しさん2013/09/20(金) 23:53:16.31
> 文字列としては同じに見えるのに
puts/print ではなく p してる?
0482デフォルトの名無しさん2013/09/21(土) 00:44:42.76
メソッドの返り値くらいマニュアルで確認しようよ
どんなアバウトな使い方なんだよ
0483デフォルトの名無しさん2013/09/21(土) 00:47:20.70
>>480
>これだとmatchオブジェクトになるんだな。

正確に言うと「MatchDataオブジェクト」だね


>なんでこんな設計になってるの? Rubyって。

パターンの一致結果を詳しく分析するニーズを想定しているからだよ
もし興味があれば、「るりま」等で MatchDataクラスの解説を読んで勉強してみて

で、一般のパターンマッチ処理だとメソッド Regexp#match では面倒なので、
代わりに Regexp#=~ を使い、一致結果を $1, $2, ... で参照する
もしMatchDataオブジェクトが必要であれば、$~ で参照できる

これで、大半のケースは事足りるはずで、わざわざ matchを使うのはレアケースだと思われ
0484デフォルトの名無しさん2013/09/21(土) 01:00:08.53
MatchDataオブジェクトをto_sでハッシュのキーにするって筋が悪いの?
いつもそうやってた。
0485デフォルトの名無しさん2013/09/21(土) 01:57:24.28
>>484
自身が>>480で書いているように、MatchDataオブジェクトを直に扱う手法は
初心者に優しくないし慣れた人でも間違えやすいし、タイピングも面倒
だから簡単な方法としてメソッド Regexp#=~ と疑似変数 $1, $2 , ... が用意されている
一般的なRubyにおける正規表現処理の解説ではこの簡単な方法で説明されているはずだし、
ほとんどのプログラムでもこの方法が使われている
だから、慣れておく事を薦めるよ

普段は誰もが知っている単純な方法でサクサクとコードを書き、イザという時には特別な手法で
困難をサラリと飛び越える.... というのが、クールなプログラマの姿ではないかと思われ
0486デフォルトの名無しさん2013/09/21(土) 03:29:53.63
見た目が同じように感じられるのに #hash が異なるクラスは
単にハッシュのキーとして使うことが想定されていない。

JavaScriptとかからの人だと、Regexp#=~より先に Regexp#match を
見つけてしまうんだろうか。
0487デフォルトの名無しさん2013/09/21(土) 09:41:28.23
>>471 , 474
基礎とかそういう問題ではなく
現在のwatirにある「不都合」について認知していないレスだったので
つまり使ってないのに憶測でレスしたんだろうなぁと思ってイラっといました
まぁ2chでいちいち環境そろえて的確な回答をする義務はありませんので構いませんよ
0488デフォルトの名無しさん2013/09/21(土) 10:30:37.71
調べるとっかかりになるレスが返ってくればラッキーぐらいに思ったほうがいいよ

http://linux.ohwada.jp/modules/smartsection/item.php?itemid=452
http://www.autoitscript.com/autoit3/docs/functions/WinWait.htm
これ見るにどうもブラウザのファイル選択ダイアログのタイトルと
autoit.WinWait の引数を揃えろってことらしいけど
まず Win32OLE から AutoIt の WinWait が自分の環境で機能するか調べてみては
0489デフォルトの名無しさん2013/09/21(土) 10:43:35.08
文字列がミュータブルであったり、純粋オブジェクト指向言語とは、みたいな
ことにも繋がる面白い疑問点だと思うけど、マニュアルよめー、答えが返って
くるとはかぎらないー、とかワンパターンなことを真っ赤になって繰り返す奴
って初心者スレで威張って人生の厳しさでも教える師匠かなんかの気分なの?

おてがるにえらくなったつもりでいい気持ち、ってやっすい満足得ているのは
結構だが、ウザいことこの上無し。
0490デフォルトの名無しさん2013/09/21(土) 11:28:06.95
あて先不明の爆発物だな・・・
0491デフォルトの名無しさん2013/09/21(土) 11:36:22.47
Rubyでこういうgem教えて下さい

・ブログをやる場合の定番gem:
・PythonのSphinxみたいなgem:
0492デフォルトの名無しさん2013/09/21(土) 21:59:14.37
Ruby2.0.0でも書いてみたけどproduct(s,s,s)って書いてるからおかしい気がする
Pythonみたいに数字でサイズを指定できないものか
http://ideone.com/zfUFM5
0493デフォルトの名無しさん2013/09/22(日) 10:49:01.08
>>489 おまえのそのレスが一番ウザい
0494デフォルトの名無しさん2013/09/22(日) 13:34:38.65
>>485
>MatchDataオブジェクトを直に扱う手法は

上にもあったけど、to_sで文字列にすれば分かりやすいし素直じゃん。
内部的な効率でも別に問題ないし。

>だから簡単な方法としてメソッド Regexp#=~ と疑似変数 $1, $2 , ... が用意されている

こっちの方がわかり辛いし、めんどくせーんじゃねえの?
0495デフォルトの名無しさん2013/09/22(日) 13:42:22.80
s = ["A", "C", "G", "T"]
b = s.product(s,s,s)
で4文字が組み合わさるけど
これが5とか10のときにわざわざs,s,s,sとかs,s,s,s,s,s,s,s,sって書くのは効率が悪いので
数字で指定できる方法ありませんあk?
0496デフォルトの名無しさん2013/09/22(日) 13:56:52.04
ないのでhaskellのreplicate関数みたいなのを自分で定義するとか

def replicate(n, arr)
[arr] * n
end

s = ["A", "C", "G", "T"]
b = s.product(*replicate(3, s))
0497デフォルトの名無しさん2013/09/22(日) 15:11:05.79
s.repeated_permutation(4).to_a
でいけるんじゃないかな。
0498デフォルトの名無しさん2013/09/22(日) 15:37:28.41
nokogiriでEUC-JPなHTMLファイルをノコノコしてるんだけど
�Uとかローマ数字があると間違って解析されちゃうんだけど
どしたらよかんべ?
$ ruby1.9 -v
ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-darwin12]
$ gem1.9 list nokogiri
nokogiri (1.6.0)
0499デフォルトの名無しさん2013/09/22(日) 15:43:07.56
まつもと先生が使ってるOSってDebianですか?
0500デフォルトの名無しさん2013/09/22(日) 16:27:05.28
>>499
WindowXP
0501デフォルトの名無しさん2013/09/22(日) 16:47:58.98
>>498

ローマ数字が定義されている EUC-JPは、実際には EUC-JP ではなく
CP1932 なので、ソース HTML が間違っていると言い切ってしまえれば
楽なのだが、とりあえず nokogiri に食わせる前にソースのまま処理して
置換しておくしかないんじゃない?

ちなみに Ruby 2.0 の Encoding には入っていないようなので、
入れてくれ、とバグレポートするのも気長な解決策ではある。
0502デフォルトの名無しさん2013/09/22(日) 16:51:07.43
ごめん CP1932 じゃなくて CP51932 だ。
そして Ruby 2.0 にはあった。
0503デフォルトの名無しさん2013/09/22(日) 17:07:35.03
Ruby2.1っていつでる予定なのか知ってる人おしえて
0504デフォルトの名無しさん2013/09/22(日) 17:11:34.56
2013/12/25
0505デフォルトの名無しさん2013/09/22(日) 19:26:29.05
>>498
Nokogiriの各クラスのparseメソッドには文字エンコーディング名称文字列を受けとる引数がある

いわゆるmetaタグで指定されているエンコーディング名がEncodingクラス的に(あるいはiconv的に)誤っているのなら、自力で指定しろ
引数側が優先されるから
0506デフォルトの名無しさん2013/09/22(日) 19:49:03.33
ruby標準の機能が貧弱だからnokogiriが使われているんだよね
だったら標準ライブラリいれちゃえよ
0507デフォルトの名無しさん2013/09/22(日) 19:55:08.88
nokogiriが何かを知っていればそんな台詞は出ない
知らないものに対して何かを言おうとするのはやめよう
0508デフォルトの名無しさん2013/09/22(日) 20:00:24.62
少なくともお前よりかはrubyを知ってます
0509デフォルトの名無しさん2013/09/22(日) 20:08:20.93
すぐ喧嘩するなお前ら
0510デフォルトの名無しさん2013/09/22(日) 20:13:19.39
中学生か高校生だよね
>よりかは
0511デフォルトの名無しさん2013/09/22(日) 20:43:34.50
>>507==>>510
突然の上から目線
その後は論点のずれているレス
学生は君のほうらしい
0512デフォルトの名無しさん2013/09/22(日) 21:10:00.40
一体誰と戦っているんだ・・・・
0513デフォルトの名無しさん2013/09/22(日) 21:41:51.93
module ActiveSupport
class TestCase < ::MiniTest::Unit::TestCase
end
end

上のコードで「::MiniTest」みたいに::の左にモジュールやクラスが指定されていない場合、どういう意味になるのでしょうか?
0514デフォルトの名無しさん2013/09/22(日) 22:18:59.41
トップレベル
0515デフォルトの名無しさん2013/09/22(日) 22:51:12.00
>>513
ディレクトリのパス表現を連想すると分かりやすい
たとえばUNIXだと、絶対パスは /usr/lib/ruby で
相対パスは lib/ruby や ruby と表現される

同様に、Rubyではモジュールの名前空間上におけるパスを表現する
(クラスはモジュールのサブクラスだから、クラスも同じ名前空間上に位置する)
たとえば、::MiniTest::Unit::TestCase は絶対パスで
Unit::TestCase、Unit、そして TestCase が相対パスになる

>>513の例であれば、絶対パス ::MiniTest::Unit::TestCase は
(>>514のいう)トップレベルからクラス TestCase へのパスを表現し、
相対パスの場合は、カレントパス(=現在のコンテクストのパス)からクラスを表現する
たとえば >>513の定義クラス(= "class" の直後にある) TestCase は相対パス表現だから、
カレントパス ActiveSupport の下に位置する相対パス ActiveCase::TestCase と同じ
0516デフォルトの名無しさん2013/09/24(火) 00:12:46.66
>>514,515
詳細な解説有り難うございます。絶対パスと分かって胸のつかえが取れました。
0517デフォルトの名無しさん2013/09/24(火) 04:33:29.74
現在押されているキーボードのキーを取得する方法はないものでしょうか
0518デフォルトの名無しさん2013/09/24(火) 04:35:37.16
kbhit
0519デフォルトの名無しさん2013/09/24(火) 20:47:17.42
SDL
0520デフォルトの名無しさん2013/09/25(水) 06:39:04.30
RSpecのディレクトリ構成について質問があります。

テストケースの中でファイル等を読み込みたい場合、何という名前のディレクトリに配置するのが一般的なのでしょうか?
0521デフォルトの名無しさん2013/09/25(水) 15:26:00.23
今日からruby勉強し始めました!
皆さん宜しくお願いします!
0522デフォルトの名無しさん2013/09/25(水) 15:34:22.49
>>520
いろいろ考えたのだが、spec/dataがいちばん無難なんじゃねーかという結論に至った
0523デフォルトの名無しさん2013/09/25(水) 17:27:46.42
RSpecのディレクトリ構成について質問があります。

テストケースの中でファイル等を読み込みたい場合、何という名前のディレクトリに配置するのが一般的なのでしょうか?
0524デフォルトの名無しさん2013/09/25(水) 17:29:11.68
>>520
適当な名前のディレクトリ掘るのが一般的ですかね。ありがとうございます。
0525デフォルトの名無しさん2013/09/25(水) 17:29:58.27
なんか色々誤爆してすいません。
0526デフォルトの名無しさん2013/09/25(水) 18:04:55.58
変数の初期化をブロック内で宣言するにはどうすればいいでしょうか

例:
count=0
10000.times do
 count+=1 if rand**2+rand**2<1
end

のcount=0をイテレータ内で記述したいのです
0527デフォルトの名無しさん2013/09/25(水) 18:23:33.16
>>526
無理
0528デフォルトの名無しさん2013/09/25(水) 18:24:26.45
>>526
値の累積(accumulation)には、Enumerable#inject を使う
変数 count は累積値を表現し、ある条件(ここでは乱数)で加算(+1)した結果を累積していく

1000.times.inject(0) { |count, _|
  if rand ** 2 + rand ** 2 < 1 then count + 1 else count end
}
0529デフォルトの名無しさん2013/09/25(水) 19:34:45.22
というかEnumerable#countがあるんだからそっち使うべき。用途に合致したメソッド使った方が可読性もいい
10000.times.count{ rand**2 + rand**2 < 1 } とか
10000.times.map{ [rand,rand] }.count{|x,y| x**2 + y**2 < 1} みたいに書くな俺なら
0530デフォルトの名無しさん2013/09/25(水) 21:37:48.09
ブロック引数に |変数群1; 変数群2| という記法もあったけど何だっけ。
0531デフォルトの名無しさん2013/09/26(木) 07:41:19.93
自分でRubyのコードを組んで主人公を操作するブラウザゲームがあったんですが知っている方いれば教えて頂きたいです
0532デフォルトの名無しさん2013/09/26(木) 07:50:49.38
injectってなんでああいう機能がinjectって名前になったの?
0533デフォルトの名無しさん2013/09/26(木) 08:40:35.53
Smalltalkerに聞いてくれ
0534デフォルトの名無しさん2013/09/26(木) 09:43:01.58
畳み込みという概念がうんちゃらかんちゃら
0535デフォルトの名無しさん2013/09/26(木) 09:55:21.27
inject, injection
アメリカ人は、まず注射を連想しますよ
0536デフォルトの名無しさん2013/09/26(木) 09:57:35.63
くりこみ群
renormalization group

畳込み積分
convolution integral
0537デフォルトの名無しさん2013/09/26(木) 10:47:29.40
fold や reduce や inject が本場であるところの関数型ではリストは再帰的に表現される
たとえば (cons 1 (cons 2 (cons 3 nil))) などのように
でもってこの cons の部分に関数を注入するのが inject

ではないだろうか(憶測)
0538デフォルトの名無しさん2013/09/26(木) 11:29:19.30
Smalltalkでは inject:into: って名前のメソッド(Smalltalkではコロンもメソッド名に含める)で、
inject: initialValue into: [:acc :each | ... ] というメッセージとして使う。

Rubyで同じことを書くと
inject(initialValue){ | acc, each | ... } となる。

acc に initialValue やブロックの結果を inject してく感じ。
0539デフォルトの名無しさん2013/09/26(木) 19:13:42.19
ブロックローカル変数宣言?
a=1
1.times{|x;a| a=2}
p a #=> 1
0540デフォルトの名無しさん2013/09/26(木) 19:43:52.97
ものすごく単純に、ブロックの「中に入れてしまいたい」だけだと思う
0541デフォルトの名無しさん2013/09/27(金) 18:55:26.82
bundlerでgemlocalに書いてからbundle installってやるのと
bundler使わないでgem install xxxxってやっていれるのとで何が違いがあるのでしょうか?
例えばrailsでthinが使いたいんですけどbundlerから入れないと使えません
0542デフォルトの名無しさん2013/09/27(金) 19:02:01.43
bundler経由だとbundlerに管理してもらえます
0543デフォルトの名無しさん2013/09/27(金) 19:11:33.54
bundle installをデフォルトで vender/pathにする方法ある?
0544デフォルトの名無しさん2013/09/27(金) 21:23:56.32
bundle config --global --path=vendor/bundle
でおk
0545デフォルトの名無しさん2013/09/27(金) 21:25:25.69
あ、--path じゃなく path だ。
0546デフォルトの名無しさん2013/09/27(金) 21:28:18.39
aとbとcで
aaa
aab
aac
aba
abb
abc
aca
acb
acc
略
ccc
見たいに全ての組み合わせを表示するライブラリがあったと思うんですがそれをおしえてください
0547デフォルトの名無しさん2013/09/27(金) 21:31:51.68
w(a b c).repeated_permutation(3).map(&:join)
0548デフォルトの名無しさん2013/09/28(土) 07:42:16.47
この本屋って新宿駅近くにあるんだけど
部屋の区割り自体が迷路のように入り組んでいて
火事で停電になったら出口判らず逃げ遅れて死者多数出ると思う
http://www.dotup.org/uploda/www.dotup.org4535669.jpg
■ このスレッドは過去ログ倉庫に格納されています