Ruby 初心者スレッド Part 67
プログラミング言語 Rubyについての、初心者向けスレです。質問・要望・雑談などをどうぞ 質問するときは、OSやRubyのバージョン、エラーメッセージを書いて下さい。 Ruby on Rails については、WEBプログラミング板で 前スレ Ruby 初心者スレッド Part 66 https://mevius.5ch.net/test/read.cgi/tech/1578068134/ るりまサーチ (リファレンス検索) 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 >>478 rails tutorialの最後の章にほぼそのままのあるからそれ見れば てか今日日cgiってまだ現役なのか xhrなどのキーワードでググったほうがいいんじゃないですかね >>478 cgiで処理できるんならcgiがjson返せばいいだけでは? それともtest.cgiが ・あなたの作ったrubyプログラムとは別 ・戻り値が出来るのに時間がかかり サーバーサイドからイベント送信する必要がある みたいな事情があるのでしょうか? >>482 やりたいことがまさにそれで、ruby側の記述がわからないというワケです CGIオブジェクトのどの値を書き換えるとajax側に返すjsonになるんでしょうか? 標準出力にJSON.generateなどで生成したjson文字列書き込めばいいんじゃないの >>484 標準出力で良いんですね というかjson以外でも受け取れました ありがとうございます 原始的なCGI使ったことあるのってもうジジイだけなのかな 根源的な理解をするにはCGIは良い教材だと思う フレームワークの恩恵も感じやすいんじゃないかなあ RailsってDBアクセスのコストが高いんですか? >>488 比較対象次第ではあるが オブジェクト指向と実態のギャップを埋めるために 相応のコストは掛かってる ただまぁこのコストが気になるレベルまで積み上がってるとしたら (Twitterみたいな大規模プロジェクトは例外として) 何かミスか勉強不足があるかと疑いたくなる フレームワークのオーバーヘッド気にするようなケースなんてほとんど無い気が フレームワークのコストよりもデータ構造の設計によって検索に処理時間かかったり、大きすぎる中間ファイルが出来たりというほうが アカウント数が増えた時には問題になると思います ファイルが大きくなったら何らかの形で分割しないといけないと思うのでボトルネックになるのは読み込むファイルのサイズになりそうな ところでまた質問なんですが 配列の後ろから1つだけ任意の要素を削除する処理を書こうとしたら rindexがnilを返したときにdelete_atがエラーになるんですが、rindexの戻り値を変数に格納して条件分岐入れるしかないですか? ary=[1,2,3,4,1,2,3,4] e = ary.rindex(2) ary.delete_at(e) p ary # 一行にしたかったけどnilになるとエラー # ary.delete_at(ary.rindex(9)) よく読んでなかったわ 可読性無視して1行に押し込みたいならこうするくらいしかないんじゃね ary.delete_at(ary.rindex(9) || ary.size) a.rindex(2)&.tap { a.delete_at(_1) } ActiveSupportがあればtry! >>493 大きいサイズ入れた時の動作仕様が今後も変わらなければいいですがちょっと不安です >>494 おおっすごい tapでselfの時のみdelete_at呼ばれる処理なら安全そうですね 参考にします ありがとうございました 句点Rubyおじの居場所をこっちにも作ってあげてください installしなくても使えるrubyを用意すれば、ユーザ増えないですかね まず初心者にも簡単に使い始められるようにしてユーザ数を増やす インストールを嫌うのはWindowsユーザー特有の習慣なわけだけど、 RubyにおいてWindowsユーザーは嫌われ者だからあえてWindowsユーザーを増やすような施策はしないだろうねえ せっかくWindowsならWSL使えで終わりにできる時代になったのだし、今更逆行させたくないだろう 休日を機にrubyの勉強を始めた もうSESで業務系・制御系客先常駐は嫌だウェブに行くんだ Node.jsやGoにしときなよ 今更Rubyはじめましたなんて保守のクソ案件やらされるだけだぞ まじか。ブートキャンプなんかもチェックしてrubyを選択してるところが多かったから最初のチョイスにはいいのかと思ったんだけど スタートアップでRubyも一時期に比べれば減ったけど全体として少なくはないと思うがなぁ まあGoやれには同意 >>504 のスキル次第かな プログラミング教育ビジネスでRubyの採用が比較的多い理由はPHPと同じで、 技術スタックが固定されていてRoRの使い方さえ覚えれば一応仕事らしいことはできるから 一方でNodeやGoだとまずAWSやGCPでインフラを設計して、、となっちゃうから前提知識が多く、教える人にとっても難しいわけだね 504がどうかは知らないけど業務系の出身の人ってペチパー上がりのWeb系に比べりゃネットワークやDBなど基盤技術に強い人が多いから、 まずはAWS SAを取るくらいを目標にしたほうがモノになりやすいかもしれない >>504 Webアプリについて学ぶならRubyからはじめるのは今でも一番効率いいよ C#とかやってるならそのままASP.NET MVCやるといい Javaの場合はSpringやSpring Bootやる前にRails一通り学んだ方が学習効率が高い のっけからフレームワークって学ぶ順番としてどうなんだろ >>508 それなりの多くは、なっちゃってエンジニアだと思うんだけど、ほとんどコピペでフレームワークを学ぶ!?雰囲気で使っている感じやんね。 TCP/IPからやれとはいわんけど 変なブログの情報どまりじゃなくMDNをリファレンスにしてくれれば迷惑はかけないかな アプリ作ってるけど、Ruby選んだのにRubyは俄然200行程度に対してJSソースがその10倍の量になった事をご報告 Rubyガイジがこのスレに誘導しているみたいだけど 今更Rubyなんて流行らないし>>503 でも指摘されているけど 新規案件でRubyやRailsなんて採用しないから初心者が勉強するだけ無駄だぞw 色んなプログラ厶スレで rubyスレ誘導はってる人がいるよね ブロックスコープを作って、そのスコープ内だけで使える変数を作るには どうすればいいのでしょうか? a = 1 { let a p a # nil } p a # 1 a = 1 ->(a = nil) { p a }[] p a ただrubocop(linter)に怒られる thenも使えそう a = 1 nil.then { |a| p a } p a そもそもメソッドじゃ駄目なんだろうか 書式設定これが見通し良くない? 無駄な#が有効利用できるからな 採用していいぞ n = 123 name = "山田太郎" puts "#05d{ n }番目は#10s{ name }です" 今日から三日間開催されているRubykaigi(Ruby会議)にて、Wasm化の話が 議題になっているらしい。 >>504 YouTube で有名な雑食系エンジニア・KENTA は、下の動画で、 未経験者はシェアが高い、Ruby on Rails でポートフォリオを作れと言ってる Django, Laravel はダメ。 特にKENTAは、PHP, Scala をオワコン認定したので、使わない方がよい 未経験からのエンジニア転職の必須教養【技術知識編】 www.youtube.com/watch?v=Q1c09rrhTjo Railsは、KENTAのサロン以外にも、RUNTEQ、東京フリーランスのデイトラなど色々ある Node.js など最悪。面倒くさすぎて勉強にならない。 Go も初心者向きじゃないので、 KENTAが勧めるキャリアパスは、Rails → Go のみ KENTAのサロンのAWS 部で皆、AWSのくろかわこうへいのサロンへも入る。 くろかわのサロンの生徒、数十人で書いた本も出てる 以下がバックエンドの最短コース Rails, Bootstrap, jQuery から始めて、 Linux, Docker, Heroku, AWS, CircleCI, Github Actions 猛者になると、Terraform, Kubernetes。 ここまで行けば、どの会社よりも上 >>488 データベース(DB)に、2千社・2億レコードあるけど、全く問題ないと外人が言ってた N+1 で一々、問い合わせをしたり、 多対多などで、索引なしで総当たりみたいな事をやっているとか? DBの実行計画を見た方がよい ミックの本も読んだ方がよい。 副問い合わせを、case に書き換えるとか、書いてあったような気がする。 よく覚えていないけど データベース資格の問題を解くとか >>478 漏れが作った、webrick のデモならあった require 'webrick/cgi' class MyCGI < WEBrick::CGI def do_GET(req, res) res["content-type"] = "text/plain" ret = "get\n" res.body = ret end def do_POST(req, res) res["content-type"] = "text/plain" ret = "post\n" res.body = ret end end MyCGI.new.start() ちょっと厄介な事かもしれないですが、配列にuniqやった時に [1,2,3,4,2].uniq これで 一番後ろの2が削除されて[1,2,3,4]になるじゃないですか uniqした後の結果を[1, 3, 4, 2]にしたい時は [1,2,3,4,2].reverse.uniq.reverse こう2回reverseやるしか無いでしょうか? reverse消すのを試みていたんですが上手い方法が思いつきません uniq後の順序に依存した実装って気持ち悪いけどドキュメント読んでみると一応保証はされてるのか ちょっと無理そうですね データ構造のほうが逆順だったらreverse無しで良かったんですが そっちはもう換えられないのでこのままにしときます reverseをreverse_eachにしたら中間のArrayは無くせる scan.map.delete_if.delete_if.shuffle[1,20] とかなっても意地で1行で書くのが真のプログラマなの? delete_ifが2つ続いてるとか mapした後にdelete_ifとか 何か良くない匂いがするとは思う >>529 意図が伝わりやすければメソッドチェーンでつなげること自体は何の問題もない ただ1行で書くかと言われれば普通は改行して読みやすくメンテしやすくする 1行でも許容できる内容かどうかは引数含めて書いてもらわないとなんとも言えない 最近メソッド10個くらい繋げたコード書いたけどごく当たり前のコーディング 真のPGはmethod_missingの魔術コード書ける人だよ サーバー側のrubyバージョンが古い時にローカル実行用スクリプトで3.0機能使ったコード書いていいものか迷う もしかしたらいつかサーバー側にコード持っていく可能性もある 書いてもいいのかな? どうせコンテナで動かすんだからどうでもいいだろ 今時サーバーにグローバルにインストールされたRubyに依存してるような腐った運用してる環境なら、イキって変なことするのはやめておけ コンテナ? 3日1回程度実行するスクリプトをこっちで行うかサーバーに持ってくかという話 こっちもpc常時起動してるわけじゃないから、正確に確実に実行するならサーバーで走らせ続けるほうが楽ではあるが ここまで書いて気づいたけどサーバーのメモリ余計に使う事になるからやっぱやめる サーバの古いRubyコードをモジュールで使うわけじゃないなら 枯れたPerlで書けば解決 ん?いや古いモジュールとかじゃなくて、 ローカル実行でもサーバー実行でも良いコードを、どちらへもっていくか みたいな話 いまどきのRubyで書くと互換性の問題がでるなら いっそPerlで書いたらという話 >枯れたPerlで書けば解決 正しいこと言ってるのに何故だか寂しくなる Perlはないかなー 3.0だと構築しやすい環境があって それがサーバーバージョンだと構築できるか不明で、 Perlだと普段使ってないんで Perlのどのバージョンでどのモジュールバージョンがインストール有効か全く知らないので、さらに構築できる可能性が薄い、、 Perlの互換性をあなどるな! Rubyごときの常識では測れぬぞ! perlは28年メジャーバージョン変えてないだけだろw 変えたらモジュールが全く付いていかず 後付けで別言語だったことにされた始末w 7にすると言った後もスルスル詐欺。もう崩壊寸前。 rubyも変えない基本機能だけ永年保証版をつくればいいか rubyで書かれたサイトはみんな死んでperlで書かれたmixiが生き残った これも現実 >>544 Perl7は、Perl5最終版をほぼそのまま引き継ぐんやろ。 せやから問題ないはず! perlの省略記法が上手くrubyにくれば文句ないんだけどな _1 ってところまでは来たけどあと少し マジックナンバーも覚えちゃえば効率良い perlの省略記法好きなんだけどプロジェクトだと使いづらいんだよな…… 教えてください。 redditのr/rubyを読んでいて、以下のようなサンプルコードを書く人がいました。 lambda do p 1 p 2 p 3 end[] lambda { p 1 p 2 p 3 }[] -> { p 1 p 2 p 3 }[] このサンプルを書いた人は、Procとか、lambdaを使った書き方の違いを説明したかったようなので 議論の本質から外れるのですが、 Endや}の後の[]は、どんな意味があるかお分かりになりますでしょうか。 手続きオブジェクト・Proc は、 Proc.new, Kernel#proc, Kernel#lambda, -> 引数{ 処理 } で作れます。 Procを呼び出すには、Prco#call, Proc#[] を使う g = -> x, y { x + y } p g.call( 3, 4 ) p g.( 3, 4 ) p g[ 3, 4 ] p -> x, y { x + y }[ 3, 4 ] これらは全て、7 と出力される 最後のものは、JavaScript のIIFE (Immediately Invoked Function Expression; 即時実行関数式)みたいなものか? 定義されると同時に実行される >>552 さん >>553 さん >>554 さん 教えていただき、ありがとうございます。 こういうcallの仕方があるって知りませんでした。 >>554 さん p g.yield(3,4)もありますね。 色々あるけどrubyは多種多様な人達がどれかを選択するためにあるっつうイメージだから 自分が使うものは限定したほうが良いよ Proc.new proc lambdaも詳細動作ちげーし しかし、Perlの融通無碍さを罵倒してたんちゃううんかい! あるかないかで言えばもちろんある 他のメジャーな選択肢と比較すれば価値が低いだけ >>559 1. Webアプリの作り方を学びたい 2. オブジェクト指向を学びたい 3. プログラミングを学びたい この3つのどれかなら今更でもRubyを学ぶ価値はある 1つの言語だけでやっていきたいみたいな考え方を持ってるならやめとけ YouTube で有名な雑食系エンジニア・KENTA の初心者向けRuby on Rails サロンが有名。 KENTA, Rails専門学校・RUNTEQ, Deanin の動画などを参照 KENTAが勧めるキャリアパスは、Rails → Go のみ 主に、未経験者のモダンな転職先がRails。 つまり、ベンチャーなどへのプロの転職用フレームワーク でもアマチュア用に、CSV などファイル操作するだけでも、Rubyは簡単 たくさんの言語を同時相互翻訳できるのに、 なぜプログラム言語はできないのだろう 言葉よりプログラム言語のほうが簡単そう 語彙は言葉の方が圧倒的に多いし、文法も複雑 プログラム言語はちょっとした違いがすぐエラーになる、ここをなんとかすれば いいわけだが 翻訳してコンパイル実行までいっぺんに考えるから作るの無理になるんじゃね まず翻訳してコンパイルエラーとかは一旦無視したコード出力してから 別のロジック・プロジェクトとして整形するようにするとかさ 段階はあると思うよ >>566 結局、翻訳先にない機能をどうにかするために ・機械語じみた可読性0の長大なプログラムに翻訳する ・翻訳元の言語のインタプリタを翻訳先の言語で作ってしまう みたいなことになるかと python2->python3の翻訳も確かうまく行かなかったんじゃなかったか? コンバージョンプログラムいろいろとあるよ 知らないだけじゃない? Java to Kotlinとか AltJS系も広義ではそうじゃないか Opalとか そういう0か100%かってのじゃなく、AIプログラミングに繋がる話だと思うけどね >>566 プログラム言語に依るのだろう RubyからPythonはできそうな気がするけど、C++からForthとかはあまりにも違いすぎて無理… そう考えると、言葉よりもプログラム言語の方が違いが大きすぎるって事だな >>566 > たくさんの言語を同時相互翻訳できるのに、 一般の言語で、完全に相互翻訳できるわけない slack の ruby-jp ってどこかに移転しました? >>566 やればできないわけもないんやから、結局は需要がない、ということやろ。 人の言葉は意志疎通のための翻訳やからアリ。 しかし、コンピュータ言語の翻訳結果は再利用のためのリソースを期待されがちやけど、ほぼムリなんでナシ。 実際、再利用でない実行のための変換なら、多用されとる。 コンパイラもそうやし、WebAssemblyなんかそのためやろし。 Haxeは、JavaScript(JS)、C++、C#、Java、JVM、Python、Lua、PHPを対象とする、 クロスプラットフォームアプリケーションを構築可能で、 各プラットフォームのネイティブ機能にアクセスできる、 オブジェクト指向のプログラミング言語 主に、HTML, JS ゲーム用で、Adobe Flash の後継。 Ruby には対応していない 「改訂2版 Ruby逆引きハンドブック」の「文字列を分割する」の所で、 split で構造体を定義するのは参考になる Struct_Fields = %i(a b c) # フィールド名のシンボル配列 Foo = Struct.new( *Struct_Fields ) # 配列展開 input_data = ":x::y:" # コロン区切り # ["", "x", "", "y"] 内の ["", "x", "y"] を取り出す p tmp_ary = input_data.split( ":" ).values_at( 0, 1, 3 ) p obj = Foo.new( *tmp_ary ) #=> <struct Foo a="", b="x", c="y"> read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる