Ruby 初心者スレッド Part 66

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 2a2c-RM0q)
垢版 |
2020/01/04(土) 01:15:34.30ID:X7t3Qsuc0
プログラミング言語 Rubyについての、初心者向けスレです。質問・要望・雑談などをどうぞ

質問するときは、OSやRubyのバージョン、エラーメッセージを書いて下さい。
Ruby on Rails については、WEBプログラミング板で

前スレ
Ruby 初心者スレッド Part 65
https://mevius.5ch.net/test/read.cgi/tech/1545421414/

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

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

逆引きRuby
http://www.namaraii.com/rubytips/

Ruby コミュニティ公式
https://www.ruby-lang.org/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2020/05/09(土) 20:06:18.70ID:9+f2Z3ZT0
>>436
RubyはRailsが強いのでWebアプリを本拠地にしていて
それはいいんだけど発展していくためにひとつは
今言ったWindows、もうひとつはAndroid
そこでアプリを作りやすい環境があるといいと思います

というのもJavaやJavaScriptはこういう
マルチプラットフォームにしやすいので
普及した面があるだろうと思うからです
2020/05/09(土) 20:10:00.35ID:I3214lBor
Javascriptがマルチプラットフォームってなんやねん
2020/05/09(土) 20:13:20.22ID:9+f2Z3ZT0
JavaScriptはエレクトロンとかあるしー
2020/05/09(土) 20:32:37.84ID:y1dzFt5uH
>>437
教養レベルの数学とは、具体的にどういう分野ですか?
2020/05/09(土) 20:55:06.27ID:I3214lBor
>>441
少なくとも留数定理知らないバカは教養がない
2020/05/09(土) 20:55:25.24ID:e5F3j8ny0
× 教養
○ 雑学
2020/05/09(土) 20:55:54.81ID:I3214lBor
ちなみに教養って東大の教養学部時代のレベルってい見な
2020/05/09(土) 21:17:50.26ID:e5F3j8ny0
ほらな。勝手な定義をし始めたw

これが教養(笑)
2020/05/09(土) 22:04:19.31ID:jpivn6ew0
東大教養部でもtypoはするんだ
2020/05/09(土) 22:21:01.05ID:otSU2ylNa
Javaだって実際にはほとんどUNIXサーバーで運用されてるわけで、Windowsとの相性の悪さは本質的な問題ではない
RubyがPythonに勝てない決定的かつ本質的な原因は、Rubyコミュニティとエンタープライズ分野の仲が極めて悪いからだ
特にMatzに至ってはエンタープライズを毛嫌いしており、意図的にエンタープライズ分野の人間をコミュニティから排除している
2020/05/09(土) 22:33:57.03ID:e5F3j8ny0
>>447
> Javaだって実際にはほとんどUNIXサーバーで運用されてるわけで、Windowsとの相性の悪さは本質的な問題ではない

UNIXサーバーで運用されるのと、Windowsとの相性がどう関係するの?
まさかUNIXサーバーで運用してるのは、WindowsやLinuxと相性が悪いからだ!って
言いたいわけ?
449デフォルトの名無しさん (ワッチョイ eaca-IfE9)
垢版 |
2020/05/10(日) 06:25:22.95ID:D36zapAH0
ID:e5F3j8ny0 はキチガイ
2020/05/10(日) 15:26:20.48ID:idocV57G0
「主張しないOSだったから世界に広がった」TRONの生みの親・坂村健が語る
2020/05/10(日) 15:38:52.32ID:wRm6C2I10
「主張しないOSだったから世界に広がった」そう張するTRONはなぜ世界に広がらなかったのか?
2020/05/10(日) 15:55:32.04ID:sqrrAwwF0
>>451
飛行機撃墜されたから
453デフォルトの名無しさん (ワッチョイ d342-jW3u)
垢版 |
2020/05/11(月) 09:52:12.09ID:9KnLD9b60
Rubyの初歩を終えたら上達のために何か作ってみたいのですが、どんなものを作るのがいいのでしょうか?
HTMLCSSを学んだのでお問い合わせフォームを作成しようとは思っているのですが、次に作成したいもの、作成できるものがよくわかっていません。
2020/05/11(月) 10:39:50.28ID:masQzK0H0
>>453
最初はローカルだけで完結するCLIツールがおすすめ
ファイル名検索、文字列検索、ファイル名の一括置換、文字列の一括置換、ログファイルの集計のようなもの
findやgrepの再発明だけど文字列操作、コレクション操作、ファイルI/O、オプションパース、エラーハンドリング、プログラムの構造化方法みたいな基本的なことが身につく
アルゴリズムのオーダーも考えながら作ると尚良い

次にWebアクセスを伴うCLIツール
AJAXが使われてないサイトの簡単なスクレイピングがおすすめ
HTTP、ロギング、非同期処理、変化する外部リソースを扱う場合の考慮点などがわかるようになる

お問い合わせフォーム自体はRuby使わなくても実現できるけど
POSTされたデータをRubyで処理したりフォーム自体をRubyから返すようなサイトを作るのは
HTML/CSS以外にHTTPとWeb framework(SinatraかRails)を学ぶ必要があるので
他言語を習得してるのでないなら上の2つくらいは問題なくできる程度にRubyに習熟してからのほうが効率がいいよ
2020/05/11(月) 11:19:12.64ID:UiQRQo+f0
railsの環境構築がダルい
nodejs入れさせられたりして、じゃあnodejsで開発すりゃいいじゃんってなる
他言語に頼るのかまったくわからん
あとwebpackerもエラー吐きまくりで原因調べてもまったく解決しない
2020/05/11(月) 11:37:06.56ID:31bxup8+a
Railsは本来的には古典的なMVCアプリに特化していて、SPAには無駄な部分がとても多いし、原理的にフロント部分についてはカバーのしようがないからね
もはや時代に合わなくなってきているのは事実
2020/05/11(月) 11:46:41.60ID:62ugI4sI0
>>453
>>454
>最初はローカルだけで完結するCLIツールがおすすめ
おおむね同意

CLIの難点は(初心者には)つまらないことだが
いきなりゲームとか作ろうとすると挫折するから
まず小物ツールを作って経験を積むのは大事だね
2020/05/11(月) 12:19:18.12ID:E4DJZwTiH
RailsがCoffeeScript推してた頃はフロントも総合した一貫性のある技術スタックにしていこうという気概があったんだけどね
結局、時代に選ばれたのはSPAとAPIでフロントとバックエンドの間に明確な技術境界を設けるというものだった
それ以来、RailsはWebの先端から脱落し、Rubyの凋落が始まった
2020/05/11(月) 12:37:05.90ID:masQzK0H0
DjangoもSpringもASP.NET(MVC/Razor Pages)もGinも
みんな時代に合わなくなってきているってことになるねw

ASP.NETなんてSSRはすでにobsolete扱い
MSは時代に合わなくなったフレームワークを莫大な開発費かけて作ってるわけだw
2020/05/11(月) 13:19:06.53ID:5SRnzYBd0
>>453
> 次に作成したいもの、作成できるものがよくわかっていません。
それは人に聞くものでもない。
自分が作りたいと思う動機付けが無ければ、意味がない。
2020/05/11(月) 13:34:37.20ID:62ugI4sI0
理想は何か作りたいアプリがあって
調べながらそのコードを書くと上達が早い

けど本当に作りたいものは難しいことが多いから
(機械学習で株式市場を予測して金を稼げるとか)
小物を作っていくうちにそれならこういうものも
できるというアイディアが湧いてくることもあるね
462デフォルトの名無しさん (アウアウエー Sae2-jgrQ)
垢版 |
2020/05/11(月) 13:46:59.41ID:MhpqGE2Na
Django はそれだけで API も造れるからまだ良いけど
Rails は終わってるな
2020/05/11(月) 14:28:23.99ID:GNIZ9TPPM
いつもの妄想虚言癖くんは相変わらずRubyもRails知らないの丸出しだな

平日昼間からID変えて連投しまくってアンチRuby&アンチMatz活動ご苦労様
464デフォルトの名無しさん (ワッチョイ 3ebb-8oPF)
垢版 |
2020/05/11(月) 16:25:29.55ID:oqh5wUWv0
超有名な「Classi」学校教育のICT活用を支援するクラウドサービスもrails製

なんと120万人近くのユーザを捌いているらしい。

これだけの規模のサービスを作れるrailsは最強。まさに覇権。
2020/05/11(月) 16:39:57.23ID:RveftTfZ0
「ユーザー数」の詳細がわからんとなんとも。
のべ/ユニーク、アクセス頻度、集中度、負荷、など。
2020/05/11(月) 16:52:03.96ID:E4DJZwTiH
https://www.itmedia.co.jp/news/spv/2005/07/news088.html
> 「課題が出せない」「試験が受けられない」――学校向けSaaS「Classi」がつながりにくい状態に 生徒から不満の声相次ぐ

Railsが悪いというつもりはないけど、まあよくある話だよね
多く見せるために全生徒をユーザー数として謳っていたけど、コロナショック以前は実際にはほとんど使われてなかったんだろう
2020/05/11(月) 20:53:05.87ID:ctqY8lB1r
俺は一通り文法学んだら数独ソルバーとかbrainf**kのインタープリタ作ってたな
2020/05/11(月) 21:52:37.48ID:M5DpbX0A0
Go, Ruby など、サーバー側は、CLI のちょっとしたフィルター・パイプなどを作るとか。
でも、しょーもない

「プログラミングのお題スレ」の簡単そうな問題を解くとか

Selenium Webdriver, Nokogiri で、簡単なものをスクレイピングするとか。
漏れはこれで、yahoo などのログインを自動化してる

SASS, Bootstrap, jQuery なども初心者向け。
Linux コマンドも、10個ぐらいは学んだ方がよい
2020/05/11(月) 22:02:19.51ID:M5DpbX0A0
Farstep【プログラミング講座】
https://www.youtube.com/channel/UCiGdng-6ZLS5tlfw0xnG3TA

この人が、ここ1週間で4本、Rails 動画を上げてる。
Bootstrap を使ってる
470デフォルトの名無しさん (ワッチョイ d342-aTVK)
垢版 |
2020/05/11(月) 23:01:03.73ID:9KnLD9b60
教えて頂きありがとうございます。
調べながら作ってみます。
ずっと先にはなりますが将来的には個人でゲームを開発してみたいです。
それから仕事としてゲーム開発に携わったりあらゆる分野で活躍できるようなプログラマーになりたいです。
2020/05/11(月) 23:52:58.38ID:RveftTfZ0
>>470
なら、RubyよりもC#!
472デフォルトの名無しさん (アウアウエー Sae2-jgrQ)
垢版 |
2020/05/12(火) 10:13:53.55ID:4WwqN1hQa
Unity + C# 超おすすめ
Ruby 忘れて良い
2020/05/12(火) 17:40:54.16ID:v0jwNoPnH
まあRubyでも怪盗ロワイヤル系のクソソシャゲなら作れるぞ
まあそんなの作れたところで今時仕事ないし、アーキテクチャ的には単なる普通のWebアプリなので
ゲーム作りのスキルはほとんど身につかなくて時間の無駄だろうけど
2020/05/12(火) 19:19:51.00ID:PEyfu59N0
RPGツクールXP/VXならばRubyなんだよなぁ
2020/05/12(火) 21:41:35.49ID:1JM+jinB0
ツクールMVでJavaScriptに変えちゃったのが残念
モバイル出力対応の都合で仕様がないんだろうけど
476デフォルトの名無しさん (ワッチョイ d342-aTVK)
垢版 |
2020/05/12(火) 22:07:41.27ID:Bhe4de5t0
C#がゲーム開発に適しているんですね。
ゲーム開発、セキュリティ関係、リモートワーク、システムエンジニアに興味があります。
477デフォルトの名無しさん (ワッチョイ d342-aTVK)
垢版 |
2020/05/12(火) 22:12:55.72ID:Bhe4de5t0
趣味レベルでもいいので将棋プログラムやチェスプログラムも作ってみたいです。
2020/05/12(火) 22:18:02.61ID:Yyd7NZU2r
いいんじゃない。自分の作ったAIと他人の作ったやつを対戦させてみればよい
2020/05/12(火) 22:35:58.24ID:1JM+jinB0
>>476
いきなり難しいのは作れないから簡単なのから作るといいよ
たとえば将棋やチェスの前にリバーシやトランプとか
もっといえば最初はCUIのマルバツから始める位でいい
2020/05/12(火) 23:29:09.40ID:6bKcudlj0
CUIのマルバツというと
先手・2、2、○
後手・1、1、×
先手・1、2、○
9秒、8、7、

とかそんな感じか?
2020/05/12(火) 23:58:29.03ID:qFAkep2ZM
>>477
作れば良かです。
2020/05/13(水) 01:08:11.15ID:fGvC/Rms0
>>480
○・・
・・・
・・×

↑みたいにCUIでも
盤面表示できるでしょ?
たった三行だし
2020/05/13(水) 06:42:48.28ID:1S/vEImaa
お前のやる言語はRubyじゃないって散々言われてんのに聞く耳持ってないなコイツ。
2020/05/13(水) 08:20:46.80ID:UxgyOyJl0
>>482
ポケモンだってCUIでできるしな!
https://www.youtube.com/watch?v=v80QzGYktK8
2020/05/13(水) 08:28:32.53ID:sTsOjaTK0
>>484
なんかすごいなw
これだけ作り込んでいるのに、パッと見てすぐ目立つ Your Heath の綴りが間違ったままなのが謎だが。
2020/05/13(水) 15:04:51.14ID:fGvC/Rms0
いやまあ本格的にゲーム作るなら
UnityとC#だろうけど

Rubyスレなんだし
とりあえずCUIの簡単なゲームから
練習するのも悪くないと思うよ
2020/05/13(水) 15:26:01.68ID:v9SqqT/+0
なにをどうやりたいのかによるな。
型なしスクリプト言語はよしあしだから。

いわゆるゲームがしたいのなら、Rubyはほどほどに。
488デフォルトの名無しさん (アウアウエー Sa93-yXYh)
垢版 |
2020/05/13(水) 15:41:23.13ID:oWyvBIrOa
curses on ruby
2020/05/13(水) 18:13:34.32ID:VSt/R8YQ0
Ruby は、小説ゲームなどのシナリオを、ゲームデータに変換するツールには使えるかも

Lua, Squirrel などを使うことも多いけど
2020/05/13(水) 19:10:38.74ID:fGvC/Rms0
RPGツクール(XP/VX)もあるし
一応ゲームライブラリもあるから
2DゲームならRubyも手軽で良いと思う
3DゲーならUnityほぼ一択だろうけど
2020/05/13(水) 19:27:44.16ID:VG+eVs4Ur
2Dゲーム用の未だに開発が続いているRubyのライブラリってあんの?
492デフォルトの名無しさん (ワッチョイ 6de6-imz8)
垢版 |
2020/05/13(水) 22:19:09.66ID:PF9y92K50
初心者です。
gem で sqlite3を入れようとしてもtkを入れようとしてもエラーになります。

署名は信頼されていません。って誰でしょう。

みなさん、どうしているの?
2020/05/14(木) 01:10:11.58ID:xwBNTZK50
こういうのってコンソールのエラー画像貼った方が分かりやすい
494デフォルトの名無しさん (ワッチョイ 6de6-imz8)
垢版 |
2020/05/14(木) 06:31:55.66ID:/X2nuCW20
492です。
msysにgccを入れたらできました。
2020/05/14(木) 10:13:36.06ID:CBkLiWJv0
>>494
ズコー。
署名なんか関係なかったやろ。w
2020/05/14(木) 13:41:01.55ID:FSEZeoAj0
漏れは、Windows 10, WSL, Ubuntu 18.04 で、
Linux側には、日本人が作った、バージョンマネージャーのanyenv で、rbenv, nodenv を使って、
ruby 2.6.6, node 12.16.2 を入れた

yarn は、Windows側に入れて、WSL から、拡張子なしのyarn コマンドを呼べる。
これは、#!/bin/sh で始まるシェルスクリプト

まず、パッケージ情報を最新にしてから、各パッケージをインストールする

sudo apt-get update

sudo apt install -y build-essential
sudo apt-get install -y libssl-dev libreadline-dev zlib1g-dev
sudo apt-get install -y libsqlite3-dev sqlite3

build-essential には、gcc(GNU C compiler), g++(GNU C++ compiler), libc6-dev(GNU C Library), make などの、
コンパイルツールが入っています

次に、openssl, readline, zlib のパッケージをインストールする。
さらに、sqlite3 関連のパッケージもインストールする

こういうパッケージが入っていて初めて、これらに対応する、Ruby gem が動く
497デフォルトの名無しさん (ワッチョイ 1f42-uRPb)
垢版 |
2020/05/17(日) 06:00:27.29ID:ziL5Ecak0
CLIツールを作成するために、Bundlerをインストールしたいのですが
コマンドプロンプトに$ gem install bundler
と入力しEnterを押しても閉じるだけで何も状況が変わっていない気がします。
既存のCLIツール作成の記述画面を調べてみても
学んだputs,if,繰り返し処理のような文法は一切なく謎の文字列にしか見えず
用語の場合は調べれば対応できるかもしれませんが、用語ではなく何を示しているのかさえわかりません。
助けてください。
2020/05/17(日) 06:12:55.96ID:C7MdgMNcr
謎の文字列ってなんだよ
499デフォルトの名無しさん (ワッチョイ 1f42-uRPb)
垢版 |
2020/05/17(日) 07:17:57.55ID:ziL5Ecak0
上からの一部になりますがこのような感じです
# bundlerをインストール
$ gem install bundler

# gemパッケージの雛形を作成
$ bundle gem str_convert_utils -b
Creating gem 'str_convert_utils'...
create str_convert_utils/Gemfile
create str_convert_utils/lib/str_convert_utils.rb
create str_convert_utils/lib/str_convert_utils/version.rb
2020/05/17(日) 07:26:20.95ID:C7MdgMNcr
で何がしたいんだよ
501デフォルトの名無しさん (ワッチョイ 1f42-EoUu)
垢版 |
2020/05/17(日) 07:34:46.84ID:ziL5Ecak0
bundlerをインストールしてCLIツールを作成したいと思っているのですがbundlerのインストールのやり方がわかりません
2020/05/17(日) 07:35:35.28ID:C7MdgMNcr
もうインストールできるだろ
2020/05/17(日) 07:36:49.43ID:C7MdgMNcr
*もうインストールできてるでしょ
504デフォルトの名無しさん (ワッチョイ 1f42-EoUu)
垢版 |
2020/05/17(日) 08:04:53.42ID:ziL5Ecak0
rubyのインストールはコマンドプロンプトで行ったので同じようにインストールするものかと思いましたが
無事にbundlerをインストールすることが出来ているようなのでよかったです
ありがとうございます
2020/05/17(日) 09:35:16.01ID:C7MdgMNcr
質問する時は以下の点に留意すると回答が得られやすいぞ
・OS, Rubyなどのバージョンを書く
・何がしたいのか明確に書く
・どうなったのか明確に書く
2020/05/17(日) 13:48:03.48ID:2FMa8UuXa
>>505
さらに
特にエラーメッセージがあるときはそれを貼る
507デフォルトの名無しさん (ワッチョイ 7f2c-JcAG)
垢版 |
2020/05/17(日) 16:36:18.35ID:VCTpJO2T0
基本、bundler だけは、gem install bundler で、グローバルに最新版をインストールする。
それ以外は、プロジェクトフォルダに、Gemfile を作って、
bundle install で、ローカル(プロジェクト毎)にインストールする

漏れの場合は、グローバルのbundler のバージョンを、1.17.2 から、2.1.4 へ更新した

bundler のバージョンを確認する
bundler -v
Bundler version 1.17.2

インストール済みのGem のバージョンを確認する
gem list bundler
bundler (default: 1.17.2)

レポジトリ内の最新バージョンを確認する
gem search -r bundler
bundler (2.1.4)

グローバルに、最新版をインストール・更新する
gem install bundler

bundler -v
Bundler version 2.1.4

gem list bundler
bundler (2.1.4, default: 1.17.2)
2020/05/17(日) 16:56:56.37ID:FIuh62egM
何か開発するのに、向いてなさすぎるな。
2020/05/19(火) 00:48:41.11ID:X2Lrxylwa
1.0.step(3, 0.2) {|n| puts n}
の実行結果が以下の通りになった。

1.0
1.2
1.4
1.6
1.8
2.0
2.2
2.4000000000000004
2.6
2.8
3.0

なんで2.4のとこが変になっちまうんでしょうか?
2020/05/19(火) 01:00:09.89ID:9Ms3yTt70
>>509
10.step(30,2){|n| puts n.fdiv(10)}
2020/05/19(火) 02:28:46.10ID:8rsHPaV60
>>509
「浮動小数点数 誤差」で検索!
2020/05/19(火) 03:20:42.99ID:X2Lrxylwa
>>511
あ、これrailsのもんだあじゃないんだね!
2020/05/19(火) 07:21:37.48ID:7tJzJz77r
誤差が嫌ならRational使え

1.step(3, 0.2r)
514デフォルトの名無しさん (ワッチョイ 4e2c-g3Kq)
垢版 |
2020/05/20(水) 00:36:49.11ID:91fxSgSA0
浮動小数点は誤差があるので、お金の計算などでは使えない

例えば、0.5 は、2 ** -1 (乗)で、2進数で割り切れる。
0.25 も、2 ** -2 で、2進数で割り切れる。
よって、0.5 + 0.25 = 0.75 も、2進数で割り切れる

つまり、2進数で割り切れる数値の、組み合わせで表せる数値は割り切れる

一方、0.1 は、2進数で割り切れない。循環小数になる。
たぶん、0.2 も割り切れないのでは?
2020/05/20(水) 00:53:31.53ID:InboTxWs0
> お金の計算などでは使えない
使えばいいと思うけどなw

10円未満は四捨五入します。ってかけば十分だろうに
たった1円のために無駄な努力するんだぜ?
2020/05/20(水) 01:23:52.48ID:DUBnOkDWr
誤差のせいで四捨五入しても一意に定まらねえよ
2020/05/20(水) 01:24:00.93ID:YPJhimCPa
銀行の理屈だと桁数が大きいので下の方のの桁が軽視できないんだと
ただ計算の仕方はものすごくいい加減
複利といっても商品によって桁の丸め方が違うらしい
歴史を重んじるらしい
文系らしい
2020/05/20(水) 01:31:03.16ID:6CLBLdpca
Rubyは文系や中卒高卒が多いんだから文系ディスはやめてやれ
2020/05/20(水) 03:12:41.37ID:InboTxWs0
>>517
文系「消費税は3%だ。端数?ちゃんと計算しろ。1円の誤差もゆるさねーぞ。」
2020/05/20(水) 04:04:26.66ID:TeIKSVMR0
>>515
「四捨五入」とか言ってまうヤツは、金の処理に口を出すな。
2020/05/20(水) 04:18:01.52ID:DUBnOkDWr
うちの環境だと

p ([0.003] * 500).reduce(:+) # => 1.4999999999999827

Array#sumだと最適化されるけどね
そもそも不確かさの精度を気にする環境でfloat使うのが間違い
522デフォルトの名無しさん (アウアウエー Sa52-pTKR)
垢版 |
2020/05/20(水) 10:24:15.42ID:Dfazl3Afa
二進数の浮動小数点数は十進数の(1/10)を表せなくて誤差の蓄積が出るって言うけど
これは二進数固有の問題ではない
十進数の浮動小数点数も十進数の(1/3)を表せなくて誤差の蓄積が出る

金の計算では条件次第だが
四捨五入することが許されてる場合は毎回四捨五入して良い
許されていなければ浮動小数点数じゃなくて分数を使え
523デフォルトの名無しさん (アウアウエー Sa52-pTKR)
垢版 |
2020/05/20(水) 10:26:00.37ID:Dfazl3Afa
>>517
桁落ちは問題だが
切り捨ては銀行や政府が儲かるように
切り上げも銀行や政府が儲かるように
都合良く設定されているね
2020/05/20(水) 10:32:35.12ID:InboTxWs0
>>523
店は?儲かるの?損をするの?
2020/05/22(金) 15:30:11.57ID:TUWJypw20
>>518
それはどの言語であれ、普及率が高ければ高いほどそうなる。
2020/05/22(金) 15:33:07.69ID:TUWJypw20
Pythonはアメリカでは教育に取り入れられている ---> 誰でもやっている
---> 上から下まで幅広くいる。
VB利用者が減ったのは、C# に移ったから ---> C#はVBプログラマでも使える証拠
でもあり、かつてのVBと同じレベルくらいの人がC#ラーにはいるということ。
2020/05/22(金) 16:23:18.04ID:PgzAS/Wx0
配列が大きくなるとHashのほうが速くなることを発見した
xは2万件くらいのデータ
a=[]
a.push(x)を繰り返すより
b=Hash.new
b[x]=0を繰り返して
として最後に a=b.keys
としたほうが速い
2020/05/22(金) 21:01:06.45ID:AU9F7jR+0
Rubyのリストは、reserve()的なことはできないんだっけ?
できないならかわりに、a[20000]=nil とかしてから、a[i](i=0〜19999)に代入していったらいいんでは?

こっちのほうがはやそう。
2020/05/23(土) 11:45:02.50ID:HsM7eDYs0
Array.new(size)
2020/05/23(土) 12:30:03.81ID:KnmbZWpz0
>>527
さすがにそれはないわ
それとも[1,1,1,1,1]を重複除去して[1]にしたい場合ってことなのかな

>>529
先にallocateしたほうが必ずしも速いわけではないので最適化したければ要計測
2020/05/23(土) 13:15:32.65ID:x0bVPHOi0
StringにはcapacityあるけどArrayのrubyインタフェースには見つからんな
C言語側ではrb_array_new2がそれっぽいが
まぁ、どうしてもそれっぽいことやりたいならArray#[]=でも拡張できるのでnew時にサイズ指定ですね。

あとはpushよりも<<の方が速かったり、
そもそも要素数が先に知る事ができるのならばArray.newにブロック渡したり
flat_map使ったり…
2020/05/23(土) 14:30:56.75ID:rR3WkHU8M
Rubyはユーザーコードの実行がとんでもなくゴミクソのように遅いから、
アルゴリズムの効率とか実はあまり関係なくて単にユーザーコードの命令数を削減することが重要だったりするね
2020/05/23(土) 16:20:51.70ID:eo29HWEv0
>>530
> 先にallocateしたほうが必ずしも速いわけではない
具体例を教えろ。
2020/05/23(土) 19:00:02.41ID:KnmbZWpz0
>>533
これ何度か繰り返して比較してみて
https://ideone.com/N26HoC

GC.disable/enable/startとかも組み合わせて試してみるといいと思う
2020/05/23(土) 20:20:01.68ID:x0bVPHOi0
>>534
# gem install benchmark_driver
require 'benchmark_driver'

Benchmark.driver do |x|
x.prelude %{ input = (1..2_000_000).to_a.shuffle
RUBY
x.report 'push without size', %{o = []; input.each{|x| o.push x }}
x.report '[]= with size (each_with_index)', %{o = Array.new(input.size); input.each_with_index{|x,ix| o[ix] = x }}
x.report '[]= with size (each)', %{o = Array.new(input.size); i=0; input.each{|x| o[i] = x;i+=1 }}
x.report 'block with size', %{o = Array.new(input.size){|x| input[x] }}
end
2020/05/23(土) 20:21:25.63ID:x0bVPHOi0
prelude書き換えてる最中に送信してしまった
x.prelude %{ input = (1..2_000_000).to_a.shuffle }


Comparison:
block with size: 12.0 i/s
[]= with size (each): 9.7 i/s - 1.23x slower
push without size: 8.9 i/s - 1.35x slower
[]= with size (each_with_index): 7.6 i/s - 1.58x slower
2020/05/23(土) 21:52:02.03ID:KnmbZWpz0
>>535
そのwith sizeとwithout sizeはpushの差では?

require 'benchmark_driver'

Benchmark.driver do |x|
x.prelude %{ input = (1..2_000_000).to_a.shuffle }
x.report 'Array.new(0)', %{o = Array.new(0); input.each{|x| o.push(x+1)}}
x.report 'Array.new(input.size)', %{o = Array.new(input.size); input.each{|x| o.push(x+1)}}
x.report 'init with []', %{o = []; input.each{|x| o.push(x+1)}}
x.report 'input.map', %{o = input.map{|x| x+1}}
x.report 'block with size', %{o = Array.new(input.size){|x| input[x]+1 }}
end

pushを使うようにすれば
要素数分のinitializeが必要なArray.new(input.size)が
高い確率で一番遅くなる
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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