-
プログラム
-
Ruby 初心者スレッド Part 60 [無断転載禁止]©2ch.net
-
UPLIFTで広告なしで体験しましょう!快適な閲覧ライフをお約束します!
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
Ruby on RailsについてはWEBプログラミング板で
前スレ
Ruby 初心者スレッド Part 59
http://echo.2ch.net/...cgi/tech/1475394638/
るりまサーチ (リファレンス検索)
http://rurema.clear-code.com/
Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/
逆引きRuby
http://www.namaraii.com/rubytips/ - コメントを投稿する
-
埋めちゃったんで立てた
-
>>1乙
Rubyもっと流行って欲しいよー -
>>1乙
-
>>前1000
どうしてもインデックスの計算やメンバ検索などで
間にRubyのコードが入ってしまうので結局遅くなるよ -
まつもとがmrubyに力いててるからなぁ
Ruby3頑張ってほしいわ -
Matzは最適化には興味ないでしょ
大半のRubyプログラマも然り -
コンパイラはできんのか
-
10レスくらいあれば落ちない?
-
Mastodonの急な流行によりRubyに脚光が!
浴びてないな
浴びてないね
Railsも微妙 -
>>8
mruby-cli?
mrubyからDLLを叩けるようになればWin32ネイティブで動くアプリを作れそうとは妄想している
mrubyは2.x.xと比べてもかなり遅いのが悩みどころ。2.x.xのつもりで書いていると速度が悲しいことになる -
JRubyのドキュメント少ないなあ
JRuby+JavaFXでGUIアプリ作ってみたい -
JavaFXの方もほとんど誰も使ってないぞ
パイオニアといえば聞こえはいいが後を追う人も誰もいなさそう -
JRubyFX便利
-
JRubyってCRubyより実行が速いって言われるけど自分が使う範囲だと遅いんだよなぁ
起動とかCRubyだと10msもかからないプログラムの終了に数秒かかるしあほらしくなるくらい遅いし
肝心の実行速度自体も速くない。1.8.x比ならともかく2.x.x比だと優位性は感じられなかった -
rubyで書かれたデスクトップアプリは何があるんだろう
個人的に知らないので、有名所があれば教えて欲しい -
有名なものはない
-
遅すぎてCに戻る。
-
昔プライベートなGUIツールをwxRuby+exerbで作ったことがあるけど大分苦労させられた
-
RubyでGUIは遅すぎて話にならなかった記憶しかない。
-
wxはPythonの方が造りやすい
-
ほとんどc/c++だから遅くはならんでしょ
-
いんや。
起動がdll読みまくりだからC#の起動時よりさらに遅いのよ。
起動が終わればまあ、気にするほどじゃ無いんだが。。。
C#の起動でさえ焦れったいから、我慢の限界超える遅さ。 -
wxRuby+exerbで作った奴は一瞬で起動するよ
Javaや.NETの方が遙かに待たされる
Ruby2.x.xでwxが使えればなぁ・・・ -
で、結局今はGUIは何で作るの?
-
HTMLですむ&RScriptをインストール出来るならActiveScriptRubyを使ってHTAと言う手もあるな
GUIを英語とにらめっこせずに標準的に書けるから結構楽 -
>>25
少なくともRubyは使わない -
Rubyは遅いと言われるけど実際の処理だとそうでもないんだよなぁ
大容量のバイナリデータを読み込んでゴリゴリ演算するような用途だと
PythonやLuaにしたところでインタプリタ稼働率の上昇やI/O性能で
コーディング量が増える割に速くならない
Rubyでも標準のCライブラリを積極的に使うような書き方をすると以外と
大差ない速度が出ちゃったりするし -
CPUの進化に助けてもらってる面はある
-
CPUはあまり関係なくね?自分は同じマシンで比べているよ
ベンチマークによってはRubyはPythonやLua(JITな奴)の1/数やそれ以下の速度しか出なかったりするけど
自分が試した限りそんなことはないな。圧倒的な速度で処理できるのかと期待すると肩すかしになる
JRubyやIronRubyも同じで、速くはならないどころか自分が試した限りでは遅くなったw
起動が遅くて実行も遅いのでは出番なし -
今のJRubyって滅茶苦茶速いはず
-
エレクトロンの本ポチってみた
これでGUI作ってみるわ・・・ -
>>31
ホントに?自分が試したのは1年ちょっと前くらいだからそんなに大昔じゃないぞ
当時すでにJRubyの速度はCRubyに対して明確に速いのが常識的な風潮だったんで
試してみたら全然そんなことなかった
今作っているのがCRuby 2.1.xで数十秒から数分かかる代物なんでこれが1/数で終わると嬉しいなぁ -
当たり前のことだけど何をやらせるかにも依るでしょ
-
>>33はきっとライブラリの実装がボトルネックになってるんだろうな
-
簡易的な計測なので参考程度だけど計ってみた
処理内容
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 -
ruby 2.4.0p0 (2016-12-24 revision 57164) [x64-mswin64_100]
70sec程度 メモリの使用は230MB程度
やっぱりCGのさじ加減? -
すまん、正確には「IOのためのAPI呼び出しのコスト」だな
CPU使用率が仮に100%でもRubyコードそのものの実行時間を測ってるのかどうかは疑わしいよ -
メモリ節約と速度は反比例するのは常識だが。。。
-
>>38
IOは足を引っ張っている。最初は処理単位(2Byteや4Byte)で呼んでいて洒落にならないほど遅かった
今は512KB単位で読み込んでいる。25MB程度の場合はreadの呼び出し回数が50回程度の
はずでかなり抑えられているはず
ただしバックグラウンドで読んでいるためにオーバーヘッドは増えている
オンメモリで処理すれば多少速くなるのは確かだろうけど扱うデータ量が多いと数百MBに達する
可能性があることを考えるとあまり現実的はないか
dl経由でCreateFileを叩いてFILE_FLAG_SEQUENTIAL_SCANを付けて開いてWinAPI経由で読み込むとか
などまだ改善しそうな策はあるけどどこまで速くなるかは何とも・・・ -
画像処理みたいに同じデータにアクセスするコードが少ないか、Rubyインタプリタみたいにループで同じデータ(この場合Rubyコード)にアクセスするコードが多いかの違いだろ。
メモリ確保した割に速くなかったからバランス取ったんじゃねーの? -
caseでラベルがラベルではなくラベルの文字列としかマッチしないって酷い仕様だな
アリエンティーすぎる -
そんなことはなかった
木の生だった -
Ruby初心者スレ的には使用メモリを気にするのは初心者の証
こういうスクリプト言語なんて自分のぶんの処理が速ければそれでいいのだ
ただし脱中級者認定要件に「Cレベルでのメモリ動作を理解し適宜気にする」という項目があるにはあるがw -
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時間の初心者なんでわからん。
具体的なコード教えてくれめんす。 -
ありがとうございます。
詳細は明かせないです(説明すると人として恥ずかしいレベルのあれやこれやの理由で)。
関数の集合と適用順番を求める処理が上位にあって。
そこから降ってきたものを具体的に計算したりするときに使いたいのです。
引数の値に対応する関数リストがあるときに関数の適用順序をif文で分岐するとコードが偉いことになるので。
引数に1が来たら関数2,3,5
引数に2が来たら関数3,7,8,12,23
、、、
引数にnが来たら関数1,13を適用
みたいな対応表で、if文で適用関数を区別せず、リストとかで処理を記述したいわけです。 -
>>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 -
Ruby始めてすぐなのならどっかででっかい条件分岐させて「実行したいメソッドとその処理順方法」を記した何かを紐づける記述が絶対に必要
それをたとえばデータ配列なんかに持つことは愚行であって(だいいちそのデータだけ見てもなにしてるか読めないし改変追加しんどいだろ)
素直に地の文で論理を記述するべきだろうね
てなわけで被らない分岐をすべて>>50のcaseで分岐させ、メソッドを実行する順番を書いただけの分岐後専用メソッドにぶん投げるのが妥当では
分岐が数十個超あるならクラス作ってファクトリーメソッドとかあのへんに行くんだろうけど1か月くらい早いと思う -
話脱線するけど、上のメソッドにp使うと
p fn(2,10,5)
#=>5
#=>nil
って表示されるけど、何に対してnilを出してるのかが分からん -
>>42
firefox/realplayerの悪口はもっと言え -
>>52
Rubyのメソッドはすべて戻り値を返す
返すべき適当な値がない場合はnilを返す
んでirbとかはメソッド戻り値も律儀に表示する
irb> def m1; end
irb> m1
=> nil
そいで画面表示するメソッドを使うと標準出力内容とメソッド戻り値が2段表示になる -
putsの返り値がnilだからでしょ
-
親切な返答ありがとうございます。
なるほど全然ダメな発想だったのですね私。
将来的な話なのですが、ゲームの雑魚敵を配列に入れた複数の関数で動きや思考や攻撃防御を制御して、
雑魚敵の部位ダメージ量や探索モードや怒りモードなどへの条件を満たすと、配列内の関数を入れ替えることで雑魚敵の挙動を制御したい。
という現時点での目標があります。
とりあえず教えてもらったコードを理解できるか今から頑張ってみます。 -
>>54
メソッドの戻り値だったのか、ありがとん -
ロボットの動きなどは、case文で書く方がまれ。
右に動く関数とか、上に動く関数とかを、Hash か配列に入れておく
キーマップなどもそう。
キー A〜Z に該当する動きを、case文で書くのは大変
呼び出される処理を、ブロックで書く。
ブロックを呼び出すのは、yield
yield(引数)とすると、その引数は、ブロック引数として渡ってくる。
{ |引数| 処理 }
処理が2行以上あるなら、do 〜 end を使えばよい
-> (引数){ 処理 }
lambda{ |引数| 処理 }
Proc.new{ |引数| 処理 }
proc{ |引数| 処理 }
Proc.new, proc では、return が使えないから、->, lambda を使えばよい -
>>56
enemy[0]=Slime.new
enemy[1]=Goblin.new
enemy[1].state=Angry.new
enemy[0].action #普通に弱い
enemy[1].action #Angryのメソッドにより強い
こういうことならオブジェクト指向について学ぶといい
ただ敵の数が多いとハードコーディングしないでメタプログラミングのがいいかもな
基礎を覚えたら -
スライムとゴブリンを別のクラスにする意味はないだろ
そんなもんデータが違うだけ -
普通、スライムとゴブリンは、振る舞い・攻撃パターンが異なるから、
別の基本クラスを継承する
スライムは、無形モンスター。
ゴブリンは、小鬼か妖精族? -
ちょっと古い DXRubyの話かと思った
-
2dのRPGやシューティングは作りやすかったけど
3dは他の使った方が良い
興味ないか…… -
>>60
基礎を覚えたらと書いてあるだろ -
いま流行りのますとどん
Rubyを学ぼうというインスタンスはないものか -
rubyの求人が無くて泣く
プログラマになりたいと思って勉強したのに・・・…
これからrubyとrailsの需要が爆発的に伸びるとかってありえますか? -
>>65
立てていいぞ -
RubyもRailsも落ち目で衰退する一方だよ
でも所詮それらは道具であり大して重要なことではない
AWSとかのインフラ方面の知識を身につけて一通り自分で作れるようになるとか、
実際にサービス作って運用してみるとか
とにかくモノ作れる奴にはいくらでも働き口はある -
趣味または職業プログラマーとして「生きていく」のにRubyは強力に役立つ
ただし職業プログラマーとして「働く」のにはあまり役に立たない
これはそういうものだ
食べていくのならRubyだけじゃなくRuby「とそれ以外」を身に着けろ -
それってRuby以外の言語でも言える事じゃね?
というか国はプログラマーの育成に力を入れているようだけどその実態はコーダーの育成
世界で戦っていく上で必要なのは英語の意味でのシステムエンジニア(≠ソフトウェアエンジニア)だろ・・・ -
ハローワークでも、Pythonの求人は、ほとんどないけど、
Rubyの求人は、たまに見る -
Ruby覚えたら次はJavaでもC#でも飯の種になりそうな言語覚えれば良いじゃん
他の言語について知ると元の言語の理解も深まるから
それこそプログラマとして働くなら特定の言語だけしか使えないなんてありえないよ -
日本に必要なのは質の高いプログラマーだと思うぞ
世界で戦えるサービスやアプリが少ないのはプログラマーの質の問題が大きい
教育面で言えばごくごく一部の大学と大学院を除くと
日本の大学よりCourseraで受けられる講義のほうがレベル高いからな
小学生にプログラミング教育するより高等教育に力入れないと話にならん
あとハローワークは知らんがRubyの求人は普通にあるよ
Rubyで人とるようなところはハロワに出さないだけじゃないの
リクナビとか一般的なサイトで調べてみたら? -
文法覚えて食えるんだったらせわないわ。
-
とりあえずRubyで色々作れるなら、他の言語でも文法とライブラリ覚えりゃ作れるでしょ。
ある日Javaでこれ作って。って言われたらJava入門書とWebのドキュメントで翌日には学びながら作り始めるのが当たり前の世界よ?
ソースはおいら。 -
ねえねえ、Rubyバイナリのバージョン管理って今でもrbenvでいいの?
-
これはdo...endと{}の結合の強さの違いによる問題だね
ここ参照して
http://rurema.clear-...ec=2fcall.html#block
上でも言われてるけどブロック付きメソッドの戻り値をpしたいときは{}使わないと思ったように動かないよ -
例えば
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
と同じ動きをする。
互換というのは明らかな誤謬。 -
ついでに、いちいち書き換えるのが面倒なら
(1..10).map do |i| i**2 end.display
(1..10).map do |i| i**2 end.tap{|e| p e}
とかって書くのもありだね -
mapをdo end で書くのキモい
-
結合の強さって初めて知ったわ
こんな仕様あったのか -
教えてください。(当方Rubyまったく無知です。)
下記のスクリプトを走らせるとSSLエラーが出るので、
拾ってきた証明書を読ませて何とかしたのですが、
open-uri.rb:359:in `open_http': 403 Forbidden (OpenURI::HTTPError)
と、エラーが出ます。UserAgentや認証やら何かでけられてると思うんですが。
403.1とかのサブエラー返してくれればまだしも原因わからず。
※Yahooボックスから一括DL
http://lp6m.hatenabl...ry/2016/08/12/184232 -
つまりそのためにYahooのアカウント取ってBOXに何か入れて検証しろと
-
普通に認証失敗してんだろ
認証に成功してるかどうかもわからないコード使って
Ruby無知です、わかりません、教えてくださいって酷いゆとりだね -
Rubyを学んでいないのならこんな古臭いスクリプトをわざわざRuby入れて使う必要はない
-
yahoo box さらうプログラムなら他にもあるよな
-
自覚も無い人間の屑共が消えろゴミカス
-
私たちはあなたのような人を売るほど見てきてるのですよルンルン
-
>>80-84
{ }, do〜end は互換じゃなかったのか!
しかし、ブロックの外側に、p を付ける方が、おかしい!
ブロックの外側に、p を付けるって事は、ブロック全体の戻り値を表示する事になる。
ブロック内の各処理の結果じゃない -
case文書く時に
case 比較したいオブジェクト名
when 値1 then
文1
って書いてあるけど
別に比較したいオブジェクト名を省略しても動くよね
ただリファレンス見てもその辺の注釈が無いけど、どういう理屈で動いてるんだろう -
>>94
>しかし、ブロックの外側に、p を付ける方が、おかしい!
なるほど、何もしらない初学者だから、こういったこともよくわかっていなかったのです
今後ともよろしくお願いいたします。
今演習をしていますが、
s = "Ruby is an object oriented programming language"
に含まれるアルファベットの頻度をカウントしようとして
s.each_char do |c| で、手がとまっています -
そうですか頑張ってください
-
s.chars.uniq.each_with_object({}){|c,h|h[c]=s.count(c)}
↑今すぐ読める無料コミック大量配信中!↑