X



Ruby 初心者スレッド Part 60 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2017/04/29(土) 02:01:58.34ID:urVXnFrH
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
Ruby on RailsについてはWEBプログラミング板で

前スレ
Ruby 初心者スレッド Part 59
http://echo.2ch.net/test/read.cgi/tech/1475394638/

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

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

逆引きRuby
http://www.namaraii.com/rubytips/
0005デフォルトの名無しさん
垢版 |
2017/04/29(土) 09:29:52.67ID:/b3MraXM
>>前1000
どうしてもインデックスの計算やメンバ検索などで
間にRubyのコードが入ってしまうので結局遅くなるよ
0010デフォルトの名無しさん
垢版 |
2017/04/29(土) 13:09:14.76ID:AqsgnRmH
Mastodonの急な流行によりRubyに脚光が!

浴びてないな
浴びてないね
Railsも微妙
0011デフォルトの名無しさん
垢版 |
2017/04/29(土) 16:27:48.07ID:cjUk9ycm
>>8
mruby-cli?
mrubyからDLLを叩けるようになればWin32ネイティブで動くアプリを作れそうとは妄想している

mrubyは2.x.xと比べてもかなり遅いのが悩みどころ。2.x.xのつもりで書いていると速度が悲しいことになる
0013デフォルトの名無しさん
垢版 |
2017/04/30(日) 07:04:15.22ID:HZc5pT/v
JavaFXの方もほとんど誰も使ってないぞ
パイオニアといえば聞こえはいいが後を追う人も誰もいなさそう
0015デフォルトの名無しさん
垢版 |
2017/04/30(日) 10:59:05.21ID:HKpgHA6l
JRubyってCRubyより実行が速いって言われるけど自分が使う範囲だと遅いんだよなぁ
起動とかCRubyだと10msもかからないプログラムの終了に数秒かかるしあほらしくなるくらい遅いし
肝心の実行速度自体も速くない。1.8.x比ならともかく2.x.x比だと優位性は感じられなかった
0016デフォルトの名無しさん
垢版 |
2017/04/30(日) 11:54:58.94ID:ZnazSADk
rubyで書かれたデスクトップアプリは何があるんだろう
個人的に知らないので、有名所があれば教えて欲しい
0019デフォルトの名無しさん
垢版 |
2017/04/30(日) 12:23:47.65ID:HKpgHA6l
昔プライベートなGUIツールをwxRuby+exerbで作ったことがあるけど大分苦労させられた
0023デフォルトの名無しさん
垢版 |
2017/04/30(日) 13:05:44.18ID:eW5YwfF4
いんや。
起動がdll読みまくりだからC#の起動時よりさらに遅いのよ。
起動が終わればまあ、気にするほどじゃ無いんだが。。。
C#の起動でさえ焦れったいから、我慢の限界超える遅さ。
0024デフォルトの名無しさん
垢版 |
2017/04/30(日) 13:27:18.11ID:HKpgHA6l
wxRuby+exerbで作った奴は一瞬で起動するよ
Javaや.NETの方が遙かに待たされる
Ruby2.x.xでwxが使えればなぁ・・・
0026デフォルトの名無しさん
垢版 |
2017/04/30(日) 14:02:35.33ID:HKpgHA6l
HTMLですむ&RScriptをインストール出来るならActiveScriptRubyを使ってHTAと言う手もあるな
GUIを英語とにらめっこせずに標準的に書けるから結構楽
0028デフォルトの名無しさん
垢版 |
2017/04/30(日) 15:29:46.79ID:HKpgHA6l
Rubyは遅いと言われるけど実際の処理だとそうでもないんだよなぁ
大容量のバイナリデータを読み込んでゴリゴリ演算するような用途だと
PythonやLuaにしたところでインタプリタ稼働率の上昇やI/O性能で
コーディング量が増える割に速くならない
Rubyでも標準のCライブラリを積極的に使うような書き方をすると以外と
大差ない速度が出ちゃったりするし
0030デフォルトの名無しさん
垢版 |
2017/04/30(日) 16:25:39.24ID:HKpgHA6l
CPUはあまり関係なくね?自分は同じマシンで比べているよ
ベンチマークによってはRubyはPythonやLua(JITな奴)の1/数やそれ以下の速度しか出なかったりするけど
自分が試した限りそんなことはないな。圧倒的な速度で処理できるのかと期待すると肩すかしになる

JRubyやIronRubyも同じで、速くはならないどころか自分が試した限りでは遅くなったw
起動が遅くて実行も遅いのでは出番なし
0033デフォルトの名無しさん
垢版 |
2017/04/30(日) 19:03:42.97ID:HKpgHA6l
>>31
ホントに?自分が試したのは1年ちょっと前くらいだからそんなに大昔じゃないぞ
当時すでにJRubyの速度はCRubyに対して明確に速いのが常識的な風潮だったんで
試してみたら全然そんなことなかった

今作っているのがCRuby 2.1.xで数十秒から数分かかる代物なんでこれが1/数で終わると嬉しいなぁ
0036デフォルトの名無しさん
垢版 |
2017/05/01(月) 00:37:35.10ID:U8II69aQ
簡易的な計測なので参考程度だけど計ってみた

処理内容
 25MB程度のWaveファイル読みながらフィードバックタイプのエフェクトを掛けてWaveファイルに吐き出す
 読み出しはダブルバッファリング。書き出しは直書き
計測方法
 数回計ってそれっぽい時数を採用
jruby 9.1.8.0 (2.3.1) 2017-03-06 90fc7ab Java HotSpot(TM) Client VM 25.25-b02 on 1.8.0_25-b18 +jit [mswin32-x86]
 65sec程度 メモリの使用は440MB程度
ruby 2.1.2p95 (2014-05-08 revision 45877) [i386-mswin32_100]
 75sec程度 メモリの使用は200MB程度
ruby 2.4.0p0 (2016-12-24 revision 57164) [i386-mswin32_100]
 90sec程度 メモリの使用は130MB程度
インタプリタの起動時間は含まないからJRubyはこれに2〜3秒加算される
jruby 1.7.12だと100秒以上かかっていたからかなり速くなっているけど、CRubyと
比べて劇的に速いってほどじゃないな。速度差はGCのさじ加減のような気も・・・
あと2.4を使ったら速くなるかと思ったら遅くなったw
0037デフォルトの名無しさん
垢版 |
2017/05/01(月) 01:09:37.50ID:U8II69aQ
ruby 2.4.0p0 (2016-12-24 revision 57164) [x64-mswin64_100]
 70sec程度 メモリの使用は230MB程度
やっぱりCGのさじ加減?
003938
垢版 |
2017/05/01(月) 01:16:50.69ID:P+4F2YiV
すまん、正確には「IOのためのAPI呼び出しのコスト」だな
CPU使用率が仮に100%でもRubyコードそのものの実行時間を測ってるのかどうかは疑わしいよ
0041デフォルトの名無しさん
垢版 |
2017/05/01(月) 03:01:26.20ID:U8II69aQ
>>38
IOは足を引っ張っている。最初は処理単位(2Byteや4Byte)で呼んでいて洒落にならないほど遅かった
今は512KB単位で読み込んでいる。25MB程度の場合はreadの呼び出し回数が50回程度の
はずでかなり抑えられているはず
ただしバックグラウンドで読んでいるためにオーバーヘッドは増えている

オンメモリで処理すれば多少速くなるのは確かだろうけど扱うデータ量が多いと数百MBに達する
可能性があることを考えるとあまり現実的はないか

dl経由でCreateFileを叩いてFILE_FLAG_SEQUENTIAL_SCANを付けて開いてWinAPI経由で読み込むとか
などまだ改善しそうな策はあるけどどこまで速くなるかは何とも・・・
0042デフォルトの名無しさん
垢版 |
2017/05/01(月) 07:02:53.40ID:lT1GiCV3
>>40
そんなことはない
速い言語ではメモリアクセスがボトルネックになることもある
それに、能力の低いプログラマはやたらとメモリを食うプログラムを作る傾向がある
0043デフォルトの名無しさん
垢版 |
2017/05/01(月) 07:18:13.85ID:fBLf4yNS
画像処理みたいに同じデータにアクセスするコードが少ないか、Rubyインタプリタみたいにループで同じデータ(この場合Rubyコード)にアクセスするコードが多いかの違いだろ。

メモリ確保した割に速くなかったからバランス取ったんじゃねーの?
0044デフォルトの名無しさん
垢版 |
2017/05/01(月) 08:19:56.73ID:3OyRI7P6
caseでラベルがラベルではなくラベルの文字列としかマッチしないって酷い仕様だな
アリエンティーすぎる
0045デフォルトの名無しさん
垢版 |
2017/05/01(月) 08:40:59.02ID:3OyRI7P6
そんなことはなかった
木の生だった
0046デフォルトの名無しさん
垢版 |
2017/05/01(月) 09:42:14.76ID:B7FMiEuI
Ruby初心者スレ的には使用メモリを気にするのは初心者の証
こういうスクリプト言語なんて自分のぶんの処理が速ければそれでいいのだ
ただし脱中級者認定要件に「Cレベルでのメモリ動作を理解し適宜気にする」という項目があるにはあるがw
0047デフォルトの名無しさん
垢版 |
2017/05/01(月) 10:18:46.45ID:lXMk8r4o
def f1(n,r)
n
end
def f3(n,r)
(n+1)%2
end
def f4(n,r)
n%2
end
def f5(n,r)
(n%r)==0?1:0
end
fs=[f1,f1,f3,f4,f5]
fs[3](21,7)
みたいに関数を配列に入れて使いたいんだが触って5時間の初心者なんでわからん。
具体的なコード教えてくれめんす。
0048デフォルトの名無しさん
垢版 |
2017/05/01(月) 10:34:15.38ID:B7FMiEuI
>>47
技術的には可能ではあるがカレーを箸で食べる方法を工夫するようなものだ
まずは何を食べるときの話なのか教えてくれると最初からスプーンを勧めることができるぞ
0049デフォルトの名無しさん
垢版 |
2017/05/01(月) 10:47:11.79ID:lXMk8r4o
ありがとうございます。
詳細は明かせないです(説明すると人として恥ずかしいレベルのあれやこれやの理由で)。

関数の集合と適用順番を求める処理が上位にあって。
そこから降ってきたものを具体的に計算したりするときに使いたいのです。
引数の値に対応する関数リストがあるときに関数の適用順序をif文で分岐するとコードが偉いことになるので。
引数に1が来たら関数2,3,5
引数に2が来たら関数3,7,8,12,23
、、、
引数にnが来たら関数1,13を適用
みたいな対応表で、if文で適用関数を区別せず、リストとかで処理を記述したいわけです。
0050デフォルトの名無しさん
垢版 |
2017/05/01(月) 11:04:38.77ID:F35eYYLf
>>49
単純に引数で処理変えたいなら、case文で場合分けすればええんで?
def fn(a,b,c)
case a
when a = 1
puts sum = b + c
puts sum = 2*b
when a = 2
puts sum = b - c
when a = 3
puts sum = b * c
when a = "div"
puts sum = b / c
end
end

fn(1,10,5)
#=>15
#=>20
fn(2,10,5)
#=>5
fn(3,10,5)
#=>50
fn("div",10,5)
#=>2
0051デフォルトの名無しさん
垢版 |
2017/05/01(月) 11:18:46.93ID:ZySc29+x
Ruby始めてすぐなのならどっかででっかい条件分岐させて「実行したいメソッドとその処理順方法」を記した何かを紐づける記述が絶対に必要
それをたとえばデータ配列なんかに持つことは愚行であって(だいいちそのデータだけ見てもなにしてるか読めないし改変追加しんどいだろ)
素直に地の文で論理を記述するべきだろうね

てなわけで被らない分岐をすべて>>50のcaseで分岐させ、メソッドを実行する順番を書いただけの分岐後専用メソッドにぶん投げるのが妥当では
分岐が数十個超あるならクラス作ってファクトリーメソッドとかあのへんに行くんだろうけど1か月くらい早いと思う
0052デフォルトの名無しさん
垢版 |
2017/05/01(月) 11:23:20.88ID:F35eYYLf
話脱線するけど、上のメソッドにp使うと
p fn(2,10,5)
#=>5
#=>nil
って表示されるけど、何に対してnilを出してるのかが分からん
0054デフォルトの名無しさん
垢版 |
2017/05/01(月) 11:53:49.39ID:ZySc29+x
>>52
Rubyのメソッドはすべて戻り値を返す
返すべき適当な値がない場合はnilを返す
んでirbとかはメソッド戻り値も律儀に表示する
irb> def m1; end
irb> m1
=> nil
そいで画面表示するメソッドを使うと標準出力内容とメソッド戻り値が2段表示になる
0056デフォルトの名無しさん
垢版 |
2017/05/01(月) 11:54:54.16ID:lXMk8r4o
親切な返答ありがとうございます。
なるほど全然ダメな発想だったのですね私。

将来的な話なのですが、ゲームの雑魚敵を配列に入れた複数の関数で動きや思考や攻撃防御を制御して、
雑魚敵の部位ダメージ量や探索モードや怒りモードなどへの条件を満たすと、配列内の関数を入れ替えることで雑魚敵の挙動を制御したい。
という現時点での目標があります。

とりあえず教えてもらったコードを理解できるか今から頑張ってみます。
0058デフォルトの名無しさん
垢版 |
2017/05/01(月) 21:44:37.52ID:+TVy5Krd
ロボットの動きなどは、case文で書く方がまれ。
右に動く関数とか、上に動く関数とかを、Hash か配列に入れておく

キーマップなどもそう。
キー A〜Z に該当する動きを、case文で書くのは大変

呼び出される処理を、ブロックで書く。
ブロックを呼び出すのは、yield

yield(引数)とすると、その引数は、ブロック引数として渡ってくる。
{ |引数| 処理 }
処理が2行以上あるなら、do 〜 end を使えばよい

-> (引数){ 処理 }
lambda{ |引数| 処理 }

Proc.new{ |引数| 処理 }
proc{ |引数| 処理 }

Proc.new, proc では、return が使えないから、->, lambda を使えばよい
0059デフォルトの名無しさん
垢版 |
2017/05/03(水) 02:23:03.67ID:wSFjLMka
>>56
enemy[0]=Slime.new
enemy[1]=Goblin.new
enemy[1].state=Angry.new
enemy[0].action #普通に弱い
enemy[1].action #Angryのメソッドにより強い

こういうことならオブジェクト指向について学ぶといい
ただ敵の数が多いとハードコーディングしないでメタプログラミングのがいいかもな
基礎を覚えたら
0060デフォルトの名無しさん
垢版 |
2017/05/03(水) 23:40:20.15ID:zkWNfzXl
スライムとゴブリンを別のクラスにする意味はないだろ
そんなもんデータが違うだけ
0061デフォルトの名無しさん
垢版 |
2017/05/04(木) 00:17:43.27ID:PMOSX9lZ
普通、スライムとゴブリンは、振る舞い・攻撃パターンが異なるから、
別の基本クラスを継承する

スライムは、無形モンスター。
ゴブリンは、小鬼か妖精族?
0062デフォルトの名無しさん
垢版 |
2017/05/04(木) 01:07:10.81ID:kDn7ReiV
ちょっと古い DXRubyの話かと思った
0063デフォルトの名無しさん
垢版 |
2017/05/04(木) 01:10:22.16ID:kDn7ReiV
2dのRPGやシューティングは作りやすかったけど
3dは他の使った方が良い

興味ないか……
0065デフォルトの名無しさん
垢版 |
2017/05/04(木) 10:08:11.63ID:4jJ2tlWM
いま流行りのますとどん

Rubyを学ぼうというインスタンスはないものか
0066デフォルトの名無しさん
垢版 |
2017/05/04(木) 23:01:56.14ID:TB6ujr0/
rubyの求人が無くて泣く
プログラマになりたいと思って勉強したのに・・・…
これからrubyとrailsの需要が爆発的に伸びるとかってありえますか?
0068デフォルトの名無しさん
垢版 |
2017/05/04(木) 23:41:48.41ID:ufmsKYbO
>>66
オブジェクト指向とか別の言語だろうと役に立つ
構文覚えただけならrubyの仕事増えようと役に立たない
それか言語を規定してない仕事でrubyを提案すればいいだろ
0069デフォルトの名無しさん
垢版 |
2017/05/04(木) 23:44:35.87ID:lRx89izX
RubyもRailsも落ち目で衰退する一方だよ
でも所詮それらは道具であり大して重要なことではない
AWSとかのインフラ方面の知識を身につけて一通り自分で作れるようになるとか、
実際にサービス作って運用してみるとか
とにかくモノ作れる奴にはいくらでも働き口はある
0070デフォルトの名無しさん
垢版 |
2017/05/04(木) 23:50:13.53ID:rtRP+bqL
趣味または職業プログラマーとして「生きていく」のにRubyは強力に役立つ
ただし職業プログラマーとして「働く」のにはあまり役に立たない

これはそういうものだ
食べていくのならRubyだけじゃなくRuby「とそれ以外」を身に着けろ
0071デフォルトの名無しさん
垢版 |
2017/05/05(金) 00:40:00.34ID:ayKeenIH
それってRuby以外の言語でも言える事じゃね?

というか国はプログラマーの育成に力を入れているようだけどその実態はコーダーの育成
世界で戦っていく上で必要なのは英語の意味でのシステムエンジニア(≠ソフトウェアエンジニア)だろ・・・
0072デフォルトの名無しさん
垢版 |
2017/05/05(金) 00:42:47.93ID:YKLEnk0e
ハローワークでも、Pythonの求人は、ほとんどないけど、

Rubyの求人は、たまに見る
0073デフォルトの名無しさん
垢版 |
2017/05/05(金) 01:01:51.97ID:78DJCXmh
Ruby覚えたら次はJavaでもC#でも飯の種になりそうな言語覚えれば良いじゃん
他の言語について知ると元の言語の理解も深まるから
それこそプログラマとして働くなら特定の言語だけしか使えないなんてありえないよ
0074デフォルトの名無しさん
垢版 |
2017/05/05(金) 01:05:47.85ID:TDjvniVu
日本に必要なのは質の高いプログラマーだと思うぞ
世界で戦えるサービスやアプリが少ないのはプログラマーの質の問題が大きい

教育面で言えばごくごく一部の大学と大学院を除くと
日本の大学よりCourseraで受けられる講義のほうがレベル高いからな
小学生にプログラミング教育するより高等教育に力入れないと話にならん

あとハローワークは知らんがRubyの求人は普通にあるよ
Rubyで人とるようなところはハロワに出さないだけじゃないの
リクナビとか一般的なサイトで調べてみたら?
0076デフォルトの名無しさん
垢版 |
2017/05/05(金) 02:14:13.82ID:iQB12R96
とりあえずRubyで色々作れるなら、他の言語でも文法とライブラリ覚えりゃ作れるでしょ。
ある日Javaでこれ作って。って言われたらJava入門書とWebのドキュメントで翌日には学びながら作り始めるのが当たり前の世界よ?

ソースはおいら。
0081 ◆QZaw55cn4c
垢版 |
2017/05/05(金) 19:56:57.31ID:u3v3zIiy
>>79
コメントありがとうございます.

しかし手元の教科書(たのしいruby)では
obj.method(list) do | ブロック変数|

end



obj.method(list) { | ブロック変数|

}
は互換であると書いてあります.評価順序の違い,とは >>78 のプログラム例では,どのような順序になるから,違う,といえるのでしょうか?
0082デフォルトの名無しさん
垢版 |
2017/05/05(金) 20:02:27.64ID:yiYPdEw2
例えば
p (1..10).map{|i| i**2}
は(1..10).map{|i| i**2}の戻り値をpするけど
p (1..10).map do |i| i**2 end

p((1..10).map) do |i| i**2 end
と同じ動きをする。
互換というのは明らかな誤謬。
0083 ◆QZaw55cn4c
垢版 |
2017/05/05(金) 20:05:43.45ID:u3v3zIiy
>>82
なるほど,よくわかりました
丁寧な回答ありがとうございました
0084デフォルトの名無しさん
垢版 |
2017/05/05(金) 20:10:13.54ID:yiYPdEw2
ついでに、いちいち書き換えるのが面倒なら
(1..10).map do |i| i**2 end.display
(1..10).map do |i| i**2 end.tap{|e| p e}
とかって書くのもありだね
0087デフォルトの名無しさん
垢版 |
2017/05/06(土) 14:02:42.85ID:2cSynca3
教えてください。(当方Rubyまったく無知です。)

下記のスクリプトを走らせるとSSLエラーが出るので、
拾ってきた証明書を読ませて何とかしたのですが、
open-uri.rb:359:in `open_http': 403 Forbidden (OpenURI::HTTPError)
と、エラーが出ます。UserAgentや認証やら何かでけられてると思うんですが。
403.1とかのサブエラー返してくれればまだしも原因わからず。

※Yahooボックスから一括DL
ttp://lp6m.hatenablog.com/entry/2016/08/12/184232
0089デフォルトの名無しさん
垢版 |
2017/05/06(土) 18:26:04.98ID:l3lhsLeM
普通に認証失敗してんだろ
認証に成功してるかどうかもわからないコード使って
Ruby無知です、わかりません、教えてくださいって酷いゆとりだね
0090デフォルトの名無しさん
垢版 |
2017/05/06(土) 18:31:44.81ID:5w6KEOXn
Rubyを学んでいないのならこんな古臭いスクリプトをわざわざRuby入れて使う必要はない
0092デフォルトの名無しさん
垢版 |
2017/05/06(土) 20:03:38.15ID:2cSynca3
自覚も無い人間の屑共が消えろゴミカス
0094デフォルトの名無しさん
垢版 |
2017/05/07(日) 03:19:50.14ID:edBtKeoY
>>80-84
{ }, do〜end は互換じゃなかったのか!

しかし、ブロックの外側に、p を付ける方が、おかしい!

ブロックの外側に、p を付けるって事は、ブロック全体の戻り値を表示する事になる。
ブロック内の各処理の結果じゃない
0096デフォルトの名無しさん
垢版 |
2017/05/07(日) 04:53:57.72ID:cg7edk1d
case文書く時に
case 比較したいオブジェクト名
when 値1 then
文1
って書いてあるけど
別に比較したいオブジェクト名を省略しても動くよね
ただリファレンス見てもその辺の注釈が無いけど、どういう理屈で動いてるんだろう
0097デフォルトの名無しさん
垢版 |
2017/05/07(日) 08:48:03.37ID:xlJMQ4jE
>>96
caseに値を指定するかどうかでwhenの値の扱いが変わる
特に不思議な仕掛けがある訳じゃなく、単純に文法上別の動作をするってだけのこと
リファレンスにも普通に書いてあるぞ
0098 ◆QZaw55cn4c
垢版 |
2017/05/07(日) 10:30:19.21ID:qkFjvNg9
>>94
>しかし、ブロックの外側に、p を付ける方が、おかしい!
なるほど、何もしらない初学者だから、こういったこともよくわかっていなかったのです
今後ともよろしくお願いいたします。

今演習をしていますが、
s = "Ruby is an object oriented programming language"
に含まれるアルファベットの頻度をカウントしようとして
s.each_char do |c| で、手がとまっています
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況