Ruby 初心者スレッド Part 60 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
プログラミング言語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/ >>前1000 どうしてもインデックスの計算やメンバ検索などで 間にRubyのコードが入ってしまうので結局遅くなるよ まつもとがmrubyに力いててるからなぁ Ruby3頑張ってほしいわ Matzは最適化には興味ないでしょ 大半のRubyプログラマも然り Mastodonの急な流行によりRubyに脚光が! 浴びてないな 浴びてないね Railsも微妙 >>8 mruby-cli? mrubyからDLLを叩けるようになればWin32ネイティブで動くアプリを作れそうとは妄想している mrubyは2.x.xと比べてもかなり遅いのが悩みどころ。2.x.xのつもりで書いていると速度が悲しいことになる JRubyのドキュメント少ないなあ JRuby+JavaFXでGUIアプリ作ってみたい JavaFXの方もほとんど誰も使ってないぞ パイオニアといえば聞こえはいいが後を追う人も誰もいなさそう JRubyってCRubyより実行が速いって言われるけど自分が使う範囲だと遅いんだよなぁ 起動とかCRubyだと10msもかからないプログラムの終了に数秒かかるしあほらしくなるくらい遅いし 肝心の実行速度自体も速くない。1.8.x比ならともかく2.x.x比だと優位性は感じられなかった rubyで書かれたデスクトップアプリは何があるんだろう 個人的に知らないので、有名所があれば教えて欲しい 昔プライベートなGUIツールをwxRuby+exerbで作ったことがあるけど大分苦労させられた RubyでGUIは遅すぎて話にならなかった記憶しかない。 いんや。 起動がdll読みまくりだからC#の起動時よりさらに遅いのよ。 起動が終わればまあ、気にするほどじゃ無いんだが。。。 C#の起動でさえ焦れったいから、我慢の限界超える遅さ。 wxRuby+exerbで作った奴は一瞬で起動するよ Javaや.NETの方が遙かに待たされる Ruby2.x.xでwxが使えればなぁ・・・ HTMLですむ&RScriptをインストール出来るならActiveScriptRubyを使ってHTAと言う手もあるな GUIを英語とにらめっこせずに標準的に書けるから結構楽 Rubyは遅いと言われるけど実際の処理だとそうでもないんだよなぁ 大容量のバイナリデータを読み込んでゴリゴリ演算するような用途だと PythonやLuaにしたところでインタプリタ稼働率の上昇やI/O性能で コーディング量が増える割に速くならない Rubyでも標準のCライブラリを積極的に使うような書き方をすると以外と 大差ない速度が出ちゃったりするし CPUはあまり関係なくね?自分は同じマシンで比べているよ ベンチマークによってはRubyはPythonやLua(JITな奴)の1/数やそれ以下の速度しか出なかったりするけど 自分が試した限りそんなことはないな。圧倒的な速度で処理できるのかと期待すると肩すかしになる JRubyやIronRubyも同じで、速くはならないどころか自分が試した限りでは遅くなったw 起動が遅くて実行も遅いのでは出番なし エレクトロンの本ポチってみた これで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のさじ加減? >>36 それIOがネックになってないか? CPU使用率を開示せよ すまん、正確には「IOのためのAPI呼び出しのコスト」だな CPU使用率が仮に100%でもRubyコードそのものの実行時間を測ってるのかどうかは疑わしいよ >>38 IOは足を引っ張っている。最初は処理単位(2Byteや4Byte)で呼んでいて洒落にならないほど遅かった 今は512KB単位で読み込んでいる。25MB程度の場合はreadの呼び出し回数が50回程度の はずでかなり抑えられているはず ただしバックグラウンドで読んでいるためにオーバーヘッドは増えている オンメモリで処理すれば多少速くなるのは確かだろうけど扱うデータ量が多いと数百MBに達する 可能性があることを考えるとあまり現実的はないか dl経由でCreateFileを叩いてFILE_FLAG_SEQUENTIAL_SCANを付けて開いてWinAPI経由で読み込むとか などまだ改善しそうな策はあるけどどこまで速くなるかは何とも・・・ >>40 そんなことはない 速い言語ではメモリアクセスがボトルネックになることもある それに、能力の低いプログラマはやたらとメモリを食うプログラムを作る傾向がある 画像処理みたいに同じデータにアクセスするコードが少ないか、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時間の初心者なんでわからん。 具体的なコード教えてくれめんす。 >>47 技術的には可能ではあるがカレーを箸で食べる方法を工夫するようなものだ まずは何を食べるときの話なのか教えてくれると最初からスプーンを勧めることができるぞ ありがとうございます。 詳細は明かせないです(説明すると人として恥ずかしいレベルのあれやこれやの理由で)。 関数の集合と適用順番を求める処理が上位にあって。 そこから降ってきたものを具体的に計算したりするときに使いたいのです。 引数の値に対応する関数リストがあるときに関数の適用順序を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段表示になる 親切な返答ありがとうございます。 なるほど全然ダメな発想だったのですね私。 将来的な話なのですが、ゲームの雑魚敵を配列に入れた複数の関数で動きや思考や攻撃防御を制御して、 雑魚敵の部位ダメージ量や探索モードや怒りモードなどへの条件を満たすと、配列内の関数を入れ替えることで雑魚敵の挙動を制御したい。 という現時点での目標があります。 とりあえず教えてもらったコードを理解できるか今から頑張ってみます。 ロボットの動きなどは、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のメソッドにより強い こういうことならオブジェクト指向について学ぶといい ただ敵の数が多いとハードコーディングしないでメタプログラミングのがいいかもな 基礎を覚えたら スライムとゴブリンを別のクラスにする意味はないだろ そんなもんデータが違うだけ 普通、スライムとゴブリンは、振る舞い・攻撃パターンが異なるから、 別の基本クラスを継承する スライムは、無形モンスター。 ゴブリンは、小鬼か妖精族? 2dのRPGやシューティングは作りやすかったけど 3dは他の使った方が良い 興味ないか…… いま流行りのますとどん Rubyを学ぼうというインスタンスはないものか rubyの求人が無くて泣く プログラマになりたいと思って勉強したのに・・・… これからrubyとrailsの需要が爆発的に伸びるとかってありえますか? >>66 オブジェクト指向とか別の言語だろうと役に立つ 構文覚えただけならrubyの仕事増えようと役に立たない それか言語を規定してない仕事でrubyを提案すればいいだろ RubyもRailsも落ち目で衰退する一方だよ でも所詮それらは道具であり大して重要なことではない AWSとかのインフラ方面の知識を身につけて一通り自分で作れるようになるとか、 実際にサービス作って運用してみるとか とにかくモノ作れる奴にはいくらでも働き口はある 趣味または職業プログラマーとして「生きていく」のにRubyは強力に役立つ ただし職業プログラマーとして「働く」のにはあまり役に立たない これはそういうものだ 食べていくのならRubyだけじゃなくRuby「とそれ以外」を身に着けろ それってRuby以外の言語でも言える事じゃね? というか国はプログラマーの育成に力を入れているようだけどその実態はコーダーの育成 世界で戦っていく上で必要なのは英語の意味でのシステムエンジニア(≠ソフトウェアエンジニア)だろ・・・ ハローワークでも、Pythonの求人は、ほとんどないけど、 Rubyの求人は、たまに見る Ruby覚えたら次はJavaでもC#でも飯の種になりそうな言語覚えれば良いじゃん 他の言語について知ると元の言語の理解も深まるから それこそプログラマとして働くなら特定の言語だけしか使えないなんてありえないよ 日本に必要なのは質の高いプログラマーだと思うぞ 世界で戦えるサービスやアプリが少ないのはプログラマーの質の問題が大きい 教育面で言えばごくごく一部の大学と大学院を除くと 日本の大学よりCourseraで受けられる講義のほうがレベル高いからな 小学生にプログラミング教育するより高等教育に力入れないと話にならん あとハローワークは知らんがRubyの求人は普通にあるよ Rubyで人とるようなところはハロワに出さないだけじゃないの リクナビとか一般的なサイトで調べてみたら? とりあえずRubyで色々作れるなら、他の言語でも文法とライブラリ覚えりゃ作れるでしょ。 ある日Javaでこれ作って。って言われたらJava入門書とWebのドキュメントで翌日には学びながら作り始めるのが当たり前の世界よ? ソースはおいら。 ねえねえ、Rubyバイナリのバージョン管理って今でもrbenvでいいの? >>78 https://ideone.com/zCU275 評価順が違う 戻り値をそのまま使う時は {} そうでなければ do end が普通かな これはdo...endと{}の結合の強さの違いによる問題だね ここ参照して http://rurema.clear-code.com/2.4.0/doc/spec=2fcall.html#block 上でも言われてるけどブロック付きメソッドの戻り値をpしたいときは{}使わないと思ったように動かないよ >>79 コメントありがとうございます. しかし手元の教科書(たのしいruby)では obj.method(list) do | ブロック変数| 式 end と obj.method(list) { | ブロック変数| 式 } は互換であると書いてあります.評価順序の違い,とは >>78 のプログラム例では,どのような順序になるから,違う,といえるのでしょうか? 例えば 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 と同じ動きをする。 互換というのは明らかな誤謬。 >>82 なるほど,よくわかりました 丁寧な回答ありがとうございました ついでに、いちいち書き換えるのが面倒なら (1..10).map do |i| i**2 end.display (1..10).map do |i| i**2 end.tap{|e| p e} とかって書くのもありだね 結合の強さって初めて知ったわ こんな仕様あったのか 教えてください。(当方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 つまりそのためにYahooのアカウント取ってBOXに何か入れて検証しろと 普通に認証失敗してんだろ 認証に成功してるかどうかもわからないコード使って Ruby無知です、わかりません、教えてくださいって酷いゆとりだね Rubyを学んでいないのならこんな古臭いスクリプトをわざわざRuby入れて使う必要はない yahoo box さらうプログラムなら他にもあるよな 私たちはあなたのような人を売るほど見てきてるのですよルンルン >>80-84 { }, do〜end は互換じゃなかったのか! しかし、ブロックの外側に、p を付ける方が、おかしい! ブロックの外側に、p を付けるって事は、ブロック全体の戻り値を表示する事になる。 ブロック内の各処理の結果じゃない >>87-92 たぶん、Rubyの問題ではない 「403 Forbidden OpenURI::HTTPError」で検索! case文書く時に case 比較したいオブジェクト名 when 値1 then 文1 って書いてあるけど 別に比較したいオブジェクト名を省略しても動くよね ただリファレンス見てもその辺の注釈が無いけど、どういう理屈で動いてるんだろう >>96 caseに値を指定するかどうかでwhenの値の扱いが変わる 特に不思議な仕掛けがある訳じゃなく、単純に文法上別の動作をするってだけのこと リファレンスにも普通に書いてあるぞ >>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)} ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる