トップページ⇒tech
984コメント268KB

Rubyについて Part47

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

前スレ
Ruby 初心者スレッド Part 46
http://hibari.2ch.net/test/read.cgi/tech/1317790320/


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

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

逆引きRuby
http://www.namaraii.com/rubytips/
0153uy2012/05/04(金) 15:40:58.06
まじめに始まってすらいないと思う
変わり続けてるせいか、枯れた技術だとはとてもいえない
0154デフォルトの名無しさん2012/05/04(金) 16:19:17.89
枯れないために変わり続けてるんだ
0155デフォルトの名無しさん2012/05/04(金) 18:37:18.48
Ruby1.9.1とか1.9.2とかで動かないgem大杉w
もう切り捨てられてるのかw
1.9.3にしたら全部すんなり動いたはw
0156デフォルトの名無しさん2012/05/04(金) 20:20:13.57
王道のRubyに加え、エンプラ分野ではJRuby、組込ではmrubyとどこでもRubyできる時代になってきたな。
0157デフォルトの名無しさん2012/05/04(金) 20:35:34.78
器用貧乏
0158デフォルトの名無しさん2012/05/04(金) 20:44:54.05
エンプラはJRubyってのはどういう理屈なの?
エンプラで実績のあるJVM, Javaのライブラリを使えるからとか?
0159デフォルトの名無しさん2012/05/04(金) 20:50:04.74
世の中で普及しているのは、
なんでもできる言語ではなく
特定の分野でずば抜けている言語です。
0160デフォルトの名無しさん2012/05/04(金) 20:53:24.02
何でもできるのと何処でも動くのとは違うだらう
0161デフォルトの名無しさん2012/05/04(金) 21:41:11.93
ブラウザでも動くようにしてくれ
0162デフォルトの名無しさん2012/05/04(金) 21:43:52.38
rubylet誕生のきっかけである
0163デフォルトの名無しさん2012/05/04(金) 22:03:23.02
mrubyってluaみたいなポジションのrubyだっけ
0164デフォルトの名無しさん2012/05/04(金) 22:12:29.29
JavaScript実装がなかなか良いのが出てこないの。
まぁなんのメリットもないからしょうがないかw
0165デフォルトの名無しさん2012/05/04(金) 22:40:07.63
JavaScriptにメリットがないからな
0166デフォルトの名無しさん2012/05/04(金) 23:49:54.90
>>163
Matzは「ライバルはLua」と言ってた気がする
組み込みやすいRubyという事で、
ある部分では競合するだろう
0167デフォルトの名無しさん2012/05/05(土) 00:10:48.84
くやしいが、 mruby が性能でLuaに勝つのはかなり厳しいな…。
言語としてはRubyのほうが圧勝なんだから、性能比較に持ち込まれないように気をつけないと。
0168デフォルトの名無しさん2012/05/05(土) 00:18:27.49
性能比較されたら負けだとおもってる
0169デフォルトの名無しさん2012/05/05(土) 00:19:37.03
Apacheモジュールのmod_luaと性能がどうのこうの言ってる人がいるけど何がしたいのか全く理解できない
人の趣味にどうこう口出すつもりはないけど...
無益だなぁとため息がでる
0170デフォルトの名無しさん2012/05/05(土) 00:31:01.97
組込の例で、ライバルとの性能比較がしたかったんだろ?
他人の愚痴に口を出す気はないけれど...
そんなことも理解できないなんて無能だなぁってため息が出る
0171デフォルトの名無しさん2012/05/05(土) 00:34:23.84
検討材料すら揃えられないんじゃ勝ち負け以前の問題だよ
0172デフォルトの名無しさん2012/05/05(土) 00:36:40.97
>>167
安定性と信頼性比較
0173デフォルトの名無しさん2012/05/05(土) 03:33:20.10
導入するにあたって性能比較するのは別に何の問題もないのでは・・・
たとえそれでmrubyの方がluaより低かったとしても程度によってはrubyの書きやすさを取るって判断するかもしれないし。
許容出来ないぐらい遅かったら採用見送るのは当然だと思うし。
0174デフォルトの名無しさん2012/05/05(土) 03:45:28.91
>>169
お前のほうが無益だから心配するなw
0175uy2012/05/05(土) 04:12:03.25
それよりも並列処理で完全に劣るんでしょ
0176デフォルトの名無しさん2012/05/05(土) 04:31:04.14
暇ができたらmruby用のJITコンパイラ書きたいな
0177デフォルトの名無しさん2012/05/05(土) 08:38:08.84
アセンブリに触れたらC99の範囲で書いた意味がないだろ
0178デフォルトの名無しさん2012/05/05(土) 08:41:32.29
Civの.pyに対抗して
コーエー三國志のAIを.rb弄ってカスタマイズできるようにしてくれ
0179デフォルトの名無しさん2012/05/05(土) 10:39:57.00
civ4はpythonで、civ5はたしかluaだったな。
吉里吉里とかの紙芝居ゲームスクリプトがrubyで書けたら特定方面で
受けるかも知れん。
0180デフォルトの名無しさん2012/05/05(土) 11:15:33.74
速度の話題はRubyでは禁忌
0181デフォルトの名無しさん2012/05/05(土) 11:25:21.24
>>177
インタプリタのレベルで評価実行すると、どうしてもひと回り遅くなるから
速度を求めるならJITで機械語に落とすのは有力なアプローチだよ
0182デフォルトの名無しさん2012/05/05(土) 12:33:41.09
いまさらだけどtrap::Hashの回避策ってブロック使うのがいいと思うんだけど

h = Hash.new([])
h[0] << 0
h[1] << 1
p h #=> {}
p h.default #=> [0, 1]

h = Hash.new{|h,k| h[k]=[]}
h[0] << 0
h[1] << 1
p h #=> {0=>[0], 1=>[1]}
p h.default #=> nil

0183デフォルトの名無しさん2012/05/05(土) 13:44:08.30
>>182
うん、そうだよ。
0184デフォルトの名無しさん2012/05/05(土) 16:17:39.64
mrubyって何がどう軽量なの?
リソースの制限が厳しい環境を想定したアルゴリズムが組み込まれてるってこと?
0185デフォルトの名無しさん2012/05/05(土) 16:36:26.42
メモリ馬鹿食いのRubyを
少しましにしたもの。
0186デフォルトの名無しさん2012/05/05(土) 16:48:38.65
省メモリ設計なRubyってこと?
もちろんフットプリントだけじゃなくて
あれこれなアルゴリズムも省メモリなんだよね?

ってことはメモリ量の多い少ないでRubyとmrubyを性能比較すれば、
多メモリだとRubyが勝って、少メモリだとmrubyが勝つんだよね?
もしそうじゃなかったらプロジェクト失敗ってことだよね?
よーし…
0187デフォルトの名無しさん2012/05/05(土) 17:26:29.86
mrubyで正規表現使えますか。
試してみた限りでは、正規表現リテラルがシンタックスエラーになります。
しかしソースコードには正規表現用のソースがあるようです。
どういうことでしょうか。
0188デフォルトの名無しさん2012/05/05(土) 17:27:31.62
>>186
違うぞ。

性能比較すれば、通常のRubyの方が勝つ。
ただし、組み込み環境だと通常のRubyは重くて”動かない”

動かないから性能などを下げて動かせるようにしたのが
mruby
0189デフォルトの名無しさん2012/05/05(土) 17:42:19.64
mrubyってのはrubyのサブセット
ようは劣化rubyだろ
組み込みやらん奴には関係なさそうだな
0190デフォルトの名無しさん2012/05/05(土) 17:46:58.04
mrubyの説明読んでわかんないような人が普段Ruby使ってるんだというのが結構ショック
0191デフォルトの名無しさん2012/05/05(土) 18:13:33.46
ゴメン説明よんでないはw
どこよめばいい?
調べるのめんどくちゃーい
「動かしてみた」「公開されたらしい」とかいう記事ばっかでいみぷ
0192デフォルトの名無しさん2012/05/05(土) 18:18:44.95
本家を見る癖ぐらいつけましょうw
0193デフォルトの名無しさん2012/05/05(土) 18:19:41.16
Ruby世代は本家を見ずにまず検索。
個人のブログを読んで終わり。
0194デフォルトの名無しさん2012/05/05(土) 18:20:52.23
本家=ぐーぐる
0195デフォルトの名無しさん2012/05/05(土) 19:17:31.39
>>187
parse.yで '/' が出てくるところに #if 0 ... #endif があるから未実装なのでは
0196デフォルトの名無しさん2012/05/05(土) 20:55:17.65
日本発だからって日本語の情報があると思うなってのを過去に学んだ俺は
英語のページを探しても見つからず、ようやくスペイン語ページで発見
0197デフォルトの名無しさん2012/05/05(土) 22:27:49.97
mrubyの家電やら車載コンピュータやらのハードに組み込むってことじゃなくて
LuaとかJavaScriptみたいに他のアプリに組み込むって意味の組み込みじゃないの?
0198デフォルトの名無しさん2012/05/05(土) 22:33:09.02
じゃない
0199デフォルトの名無しさん2012/05/06(日) 03:43:04.08
そもそもmrubyでrubyが標準で持ってるライブラリがほとんどないし
単体で使うものではなく、組み込みの言語処理系として使うためのものだろ
0200デフォルトの名無しさん2012/05/06(日) 03:45:49.64
そうだよ。Rubyの機能を最小限まで減らして、
ディスク容量とメモリ容量を減らしたもの。
機能的に劣る。メモリを使わない分遅い。
でも仕方がない。組み込みってのは制限がきついんだ。
0201デフォルトの名無しさん2012/05/06(日) 05:49:58.45
組み込みってみんなが言ってるのは>>197が最初に言ってるような
いわゆる組み込みシステムのことなの?
ルンバをmrubyで制御しちゃうの?
0202uy2012/05/06(日) 07:21:12.42
mrubyのホームページできてるな
http://www.mruby.org/
0203デフォルトの名無しさん2012/05/06(日) 07:29:04.83
2年前にドメインとって放置状態じゃんw
0204デフォルトの名無しさん2012/05/06(日) 08:42:37.56
>>203
ルンバは新製品出てるよ
0205デフォルトの名無しさん2012/05/06(日) 09:23:31.22
>>201
両方だよ
下のレイヤーとのインターフェースを自分で書けばRuby処理系が使えるし
mruby自体はC99の範囲で書いるらしいし

0206デフォルトの名無しさん2012/05/06(日) 16:18:00.78
ルンバに乗るのはRubyじゃなくネコ
0207デフォルトの名無しさん2012/05/06(日) 18:54:49.40
ttp://d.pr/JONs
これかw
0208デフォルトの名無しさん2012/05/08(火) 09:11:54.66
WEBサービスで

# yaml generator
require "yaml"
puts eval($stdin.read).to_yaml

というRubyスクリプト入力すると短縮URLをゲットできて
そこにアクセスすると標準入力のテキストを入力できて
[実行]ボタンをクリックすると

Input:
[1,2,[3,{4=>5}]]

Output:
- 1
- 2
- - 3
- 4: 5

を得られる所ないかな。
どちらかと言うとサンプルじゃなく実用コード仕込める所。
0209デフォルトの名無しさん2012/05/08(火) 09:23:21.20
とりあえず危険なので「てめえでサーバ借りて実行しろ」「貴様の目の前にある箱は飾りか」というのが一応の回答
制限つきででもあればあったで面白そうだけどね
似たようなのはどっかで見た記憶もあるんだが、どこだったか
0210デフォルトの名無しさん2012/05/08(火) 09:52:34.11
http://ideone.com/f8DmT
→[upload with new input]→[ideone it!]
0211デフォルトの名無しさん2012/05/08(火) 10:25:22.21
Rubyでは、メソッドを定義した部分をフックできるような機能が用意されてますが、
同様のことはインスタンス変数でもできないでしょうか。
インスタンス変数に値をセットしたときに呼ばれるフック関数みたいなのがあれば教えて下さい。
なおやりたいことは、インスタンス変数への操作を記録することです。
0212デフォルトの名無しさん2012/05/08(火) 11:42:39.84
自力で全部用意すればできると思うんだが、きっとあんまり楽しくないぞ
「アクセスが記録されるのでアクセサメソッド使ってくださいね♪」とマニュアルにピンクの字で書いとけ
Rubyは「ユーザーの操作をプログラム的に監視して禁止や警告をする」のはあんまり得意ではない(放任主義)
再定義を監視するのができなかったがたぶんファイナライザ定義すればきっとできる(たぶん)

class LoggingProxy
REQUIRED = %w(__send__ object_id)
instance_methods.each{|mes| undef_method(mes) unless REQUIRED.include?(mes.to_s)}
def initialize(obj, orig_var, log = nil)
@obj, @orig_var, @log = obj, orig_var, log
end
def method_missing(name, *args, &block)
@log.warn("from #{name}") if @log
@orig_var.__send__(name, *args, &block)
end
class << self; attr_accessor :logger; end
end

class C
require 'logger'
def initialize
@log = Logger.new($stderr)
@var = LoggingProxy.new(self, 'ORIGINAL_VARIABLE', @log)
end
def hoo
p @var.downcase
@var = 'NEW VALUE!'
p @var.downcase
end
end
C.new.hoo
0213デフォルトの名無しさん2012/05/08(火) 11:57:13.36
ああ、そういやクラスメソッドの logger は結局使わなかったんだ
class メソッドが undef_method で消えちゃってアクセスできないんだよね
class << self; attr_accessor :logger; end の部分は見なかったことに
0214デフォルトの名無しさん2012/05/08(火) 13:48:48.24
>>212
一生懸命書いてくれたところに悪いのですが、これは何が言いたいのでしょうか。
質問は、

> インスタンス変数に値をセットしたときに呼ばれるフック関数みたいなのがあれば教えて下さい。

です。
@foo = 999
みたいに、インスタンス変数に代入したときにそのことを検出する方法があれば教えてください。
0215デフォルトの名無しさん2012/05/08(火) 14:02:05.80
というか、そもそもやる理由ないと思うんだけど
インスタンス変数にアクセスするなら自己責任だし
どっかで誰かが書き換えるのを阻止する理由はない
0216デフォルトの名無しさん2012/05/08(火) 14:04:24.15
検出と書いてあるように見えるが
0217デフォルトの名無しさん2012/05/08(火) 15:01:57.76
Kernel#set_trace_func でやるのが正攻法なのかなぁ。と思ったけど
こっからインスタンス変数の設定を読み取るのは出来るんだろうか。
0218デフォルトの名無しさん2012/05/08(火) 15:22:47.52
set_trace_func(
  lambda{|event, file, line, id, binding, classname|
    if event == "line" and line == <assignment_linenum>; ...

(´・ω・`)これはあかん。あかんよ
0219デフォルトの名無しさん2012/05/08(火) 16:59:10.78
デバッガでの変数ウォッチ実装するのに必要だから出来ないはずはないんだけどなぁ。
0220デフォルトの名無しさん2012/05/08(火) 22:58:17.93
LLバトルロワイヤル21 の一部から見えない人によると
http://toro.2ch.net/test/read.cgi/tech/1330003774/902
構文解析の不具合のようですな

p ->do
1
1.times do end
end

メソッドコールの括弧を省略しなければ通る
p(->do
1
1.times do end
end)

->do end なんて書く人がどれだけいるのか謎だけど
0221デフォルトの名無しさん2012/05/09(水) 00:18:46.72
>>217,218,219
なるほど、set_trace_func()というデバッガ向けの機能があるんですね。
試してみます。ありがとうございます。

>>218
>(´・ω・`)これはあかん。あかんよ

なんであかんのん?
0222デフォルトの名無しさん2012/05/09(水) 09:07:49.61
>>220
結合強度を考えると必然だと思うが。
0223デフォルトの名無しさん2012/05/09(水) 10:23:29.50
doは結合強度低いのが存在意義みたいなもんだからね
0224デフォルトの名無しさん2012/05/09(水) 16:48:27.03
>>221
インスタンス変数に代入している行の番号をハードコードしてるから
ソースへの行の追加や削除に対して脆弱だなと思って

ただソースコードにset_trace_funcを埋めこむのではなく
対話型デバッガから行番号を指定させる場合とかなら便利に使えそう
0225デフォルトの名無しさん2012/05/09(水) 17:30:19.40
新ラムダの場合
->(){}
->()do end
両者の結合強度は同じなのでは?

p ->() do end
が
p( ->()) do end
になったりしたらそもそも成立しないのだから
現に
p ->() do end は p( ->() do end ) と解釈されるし

ところで、エラー再現最小コードはこれだった
p ->do 1.times do end end

begin endでも似たようなことがおこる
いままでそんな記述をする人がいないので問題にならなかったのかな
p begin 1 end #通る
p begin 1.times do 1 end end # エラー
もちろん
p( begin 1.times do 1 end end ) # 通る
0226uy2012/05/09(水) 20:38:08.92
>>225
あ、これって->と関係ないバグじゃん
報告行くしかないぜ
0227uy2012/05/09(水) 20:49:46.67
報告した
どうでもいいけどRD?ってものの書式分からなくてミスった
どう書くのあれ・・・
0228デフォルトの名無しさん2012/05/10(木) 01:48:25.48
p begin 1.times do end end # エラー
p begin p do end end # エラー

p -> do 1.times do end end # エラー
p -> do p do end end # 通る

begin endの方は関数形式でもエラーになるね
0229デフォルトの名無しさん2012/05/11(金) 19:00:31.26
Rubyって幼稚園の時に使ってたでんぷん糊みたいだよね
http://process5.img.jugem.jp/20100326_737012.jpg
0230デフォルトの名無しさん2012/05/11(金) 21:27:48.63
グルー言語だけに?
0231デフォルトの名無しさん2012/05/12(土) 06:39:08.53
大人が使うとそれなりのものが作れるけど、
幼児が使うとネバネバのベチャベチャになるということ。
0232デフォルトの名無しさん2012/05/12(土) 10:30:39.60
と言うかネバネバのベチャベチャにして
糊とはいかなるモノなのかを身体で感じさせるのが目的だけどねアレ
0233デフォルトの名無しさん2012/05/12(土) 11:01:49.16
フエキ糊ボトル型のハンドクリームとかあるんだぜ。
0234デフォルトの名無しさん2012/05/12(土) 12:10:59.38
完全敗北かよ…orz
http://codezine.jp/article/detail/2482?p=2

3.1. 基本情報
http://codezine.jp/static/images/article/2482/html/table1.html
3.2. 機能
http://codezine.jp/static/images/article/2482/html/table2.html
3.3. 操作性
http://codezine.jp/static/images/article/2482/html/table3.html
3.4. 総合評価
http://codezine.jp/static/images/article/2482/html/table4.html
0235デフォルトの名無しさん2012/05/12(土) 17:02:19.24
https://trac.macports.org/browser/trunk/dports/lang/ruby19/Portfile

これMacPortsのruby19なんだけど、
versionは1.9.3-p194なのに、
gemが入るディレクトリ名とか1.9.1とかで混乱するんだけどこれはミス?

それとも1.9.3は1.9.1系なの?
だからこれでOKなの?
0236デフォルトの名無しさん2012/05/12(土) 17:40:31.69
http://www.ruby-lang.org/ja/news/2010/08/18/ruby-1-9-2-is-released/#label-7
ライブラリパスの1.9.1はABIのバージョンであって、rubyのバージョンではない。
0237デフォルトの名無しさん2012/05/12(土) 17:43:04.85
そこは「APIのバージョン」という、インタプリタのバージョンとは別の数字ということになってる
(あるいは、1.9.3のリリースの時には、なってた)
0238デフォルトの名無しさん2012/05/12(土) 18:01:14.54
embeddedだから当たり前といえばあたり前なのかもしれなけど
mruby は 64bit対応してないな…segmentation errorでこける…
0239デフォルトの名無しさん2012/05/12(土) 18:20:05.81
なるほどねー
ややこしいけどしかたないねー
0240デフォルトの名無しさん2012/05/12(土) 23:48:23.25
>>238
embeddedだからポータブルで当然だし
バグだと思うよ
0241デフォルトの名無しさん2012/05/13(日) 00:04:31.41
そういえばRubyチップはまだなのかい?
LLプログラマブルなガジェットとか楽しそうじゃん
0242デフォルトの名無しさん2012/05/13(日) 00:23:41.70
YARV と RiteVM の比較マダー
0243デフォルトの名無しさん2012/05/13(日) 11:22:52.80
1.8.6でからruby使ってないんだけど、最近一層Windowsの冷遇が進んでる?
最新版のMS-Win32版のバイナリが見つからないんだけど。
0244デフォルトの名無しさん2012/05/13(日) 11:49:42.49
なんで一瞬で見つかるのに、お前それが出来ないの?

「Ruby 1.9.3」登場、Windows向けインストーラー「RubyInstaller」にも新版が追加
http://www.forest.impress.co.jp/docs/news/20111101_487883.html
0245デフォルトの名無しさん2012/05/13(日) 12:12:53.65
mswin32版ではなくmingw32版だから…
0246uy2012/05/13(日) 13:46:49.89
ゆんゆん電波降り注ぎングで工作員かきこんじゃいまひゅううううううううううううううううううううううううううううううううううううううううううううううううう
0247デフォルトの名無しさん2012/05/13(日) 14:29:32.52
探さないと見つからない時点で充分冷遇
0248デフォルトの名無しさん2012/05/13(日) 15:35:06.61
探さずに見つかるってどういう状態?
0249uy2012/05/13(日) 15:52:30.14
RubyはWindowsで使ってこそ真価を発揮する
0250デフォルトの名無しさん2012/05/13(日) 16:31:27.63
http://ja.wikipedia.org/wiki/Lua
>Luaにおけるテーブル(連想配列)の実装はかなり最適化されており、特に>キーに数値のみを使用した場合は、単純な配列としてさらに高速に動作する>ようになる。

Rubyもこうしようよ。こっちの方が良いよ。
ArrayとかHashとか使い分けたくないじゃん!
0251デフォルトの名無しさん2012/05/13(日) 16:57:26.16
言い方の問題だな
数値以外もキーに使えるが、その場合の動作は低速となる
0252デフォルトの名無しさん2012/05/13(日) 17:49:39.53
よし、じゃあ比較してみるんだw
■ このスレッドは過去ログ倉庫に格納されています