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
>>171 ああなるほど それで行けますね 昔は自分でもそんな書き方してたかもしれなかったです >>172 ご案内ありがとうございます シングルクォートとダブルクォートの意味とか違いは理解していたのですが 中に\入れたときとか、とくに168さんに指摘されたように8進数での扱いが特別だということは よく理解していなかったので、これを機会に知識を正確にしておきます 完全にプログラミング0からで「スラスラ読めるrubyふりがなプログラミング」を買って始めたのですが macbookairでrbenvでruby3.0.1をダウンロードしてrbenv versionでは3.0.1と表示されるのですがruby -vでは2.6.3と元々入ってるrubyが表示されます まだ何も分かってないのにhomebrewとrbenvのダウンロードが上手くいかず色々見ながらやってきたので余計な事をしてしまったのではないかと心配です >>174 ですが 自己解決しました bash profileに何か誤ったものを書き込んでしまったようで消したら3.0.1に切り替わりました Rubyで、syntax error 的なものが生じていても、そのまま実行が続けられている ように見える現象が時々起きる。 これは何が起きている? errorが起きた場所で停止させる方法はある? >>176 そのエラーが起こった時に何が表示されているの? >>178 例えば、xxx という変数を定義してない状態で、 [aaa.rb] def some_func() ・・・ print( "xxx=#{xxx}\n" ); ・・・ end という関数を呼び出すと、 aaa.rb:3882:in `some_func': undefined local variable or method `xxx' for main:Object (NameError) from aaa.rb:5638:in `main' from aaa.rb:5667:in `<main>' と出るが、そのまま実行が続けられてしまう。 >>179 begin rescue end の構造してるだけじゃないの >>181 再現するコードを共有することはできますか? >>182 できない。 大事なコードだから非公開。 そうであれば我々にはわかりえない。 まあどっかでrequireをオーバーライドしてるとかじゃないの。 >>184 全部自分で書いたコードで、Rubyの基本的な機能しか使ってない。 また、検索してみたが、begin や rescue というキーワードは全く使ってなかった。 別スレッドも停止させたいのであれば、Thread.abort_on_exception=trueが必要とか? さすがのRubyでも、そんなアホみたいな「バグ」なんかないやろ。w おまえさん一人だけの症状なんだし再現できるコード・環境を出せない以上おま環 >>170 コマンドプロンプトでも普通に、/ を使える。 これで実行できる ruby C:/Users/Owner/Documents/a.rb パスに空白が入っている場合は、シングル・ダブルクォーテーションで囲む PowerShell(PS)でも良いし。 Windows Terminal なら、Bash, PS、コマンドプロンプトの3つを使える Powershellで標準出力をリダイレクトしてると Ctrl-C押した時at_exitに飛ばずに死ぬの何なの? そのアプリが、SIG-INT・中断をキャッチしない場合は、 SIG-KILL・強制終了されるのだろう 強制終了は、受け身が取れない。 たぶん、デフォルトの挙動は、そうなのだろう リダイレクトしていなければ普通にat_exitに飛ぶんだよ 試しにpythonでもatexit使ってみたが同様に強制終了される Traceback出力されるのにatexitは実行されない powershellがバグってる cmd /c 経由なら正常にリダイレクトおよびctrl+cできたわ え〜〜マジっすか 検証してくれてありがとうございました。 まずパイプが終了して、それに巻き込まれてpythonのプロセスが落ちるとかなんとか rubyの挙動を調べるためにpythonでググるってなんだかな 現在ラズパイにrubyとpythonを入れて処理を並列に自動実行しようと思ってます ただ台数が多いため一台ごとにソースを変えるのは回避したいです なので理想は起動時に最新のソースに自動で更新です このようなことをしたいときはどのようにするのが一番簡単でしょうか? rubyでサーバーから最新のソースをコピーしたあとにrubyとpythonを実行? 家で使用するのでセキュリティーとかは気にしません >>204 厳密に一斉に切り替わらなくてもいいならcronとかで定期的にGitHubからpullする 手段が目的だと堂々と言えるならKubernetesのクラスタ組むとかも面白い ライブラリのopenのように、 open() do |f| ・・・ end と書いてもよく、 f= open() ・・・ f.close と書いてもいいというクラスor メソッドは どうやって作ればいいのでしょうか。 yieldを使うとイテレータのみになってしまうし、 returnすると下の例だけになってしまいます。 >>208 ありがとうございます。 うまく作れました。 すみません、もう一つ教えて下さい。 rubyというかプログラムを書くとき全般の注意として、 ファイルopenとcloseはなるべく近くに書くようにと ありました。 恐らくclose漏れを警戒しているのだと思います。 yieldを使えば、以下コードでそれを実現できます。 def fileInterface f= open() begin yield f ensure f.close end end yieldを使わないパターンでは、 closeを近くにかけないのですが解決策あるでしょうか。 def open @f= open() return @f end def close @f.close end openメソッド実行 ・・・ ・・・(大量の処理) closeメソッド実行 >>210 大量の処理を関数にして分離。 あるいは、しょせん理想でしかないので、離れていても気にしない。 >>210 close漏れを警戒するのであれば、openにそのままブロックを渡した方がいい openはブロックの実行結果を返し、ブロック脱出時に勝手にcloseします まぁ、どうせclose漏れしてもそのうちGCに回収されるかプロセス終了時にcloseされる >>210 yield使った実装とやることは同じ f= open file begin 大量の処理を含むメソッド f # <― yieldがメソッドに変わるだけ ensure f.close end 同じだからこそ毎回同じことを書かなくてもいいようblock付きで呼び出す open(file){|f| 大量の処理を含むメソッド f} 大量の処理を手続きオブジェクトに分離するのは、やりました。 やっぱりそれしかないかな。 ブロック付きで渡すのはオブジェクト指向ではない コードになりやすく、今回は考えてないです。 また、全体をensureで囲うのは、 さすがにensure対象が暗黙的すぎてちょっとな・・・です。 >>214 > ブロック付きで渡すのはオブジェクト指向ではない > コードになりやすく そうか? まあ、「オブジェクト指向」にもいろいろあるからな。w railsにおいて あるフォームから特定の変数に送られるデータの内容を固定したいのですがなにかいい方法ありますか? 具体的には <%= form_with model: @hoge do |form|%> <%= form.text_field :name , value: 'hoge'%> <%= form.submit %> <% end %> と書かれている場合 hogeというモデルのnameという変数に必ずhogeが入るようにしたいのですが上の書き方だと初期値にhogeが入るだけで編集可能になってしまいます。 openに、ブロックを渡す方法は、 コンテキスト・マネージャーという、多くの言語で使われているデザインパターン これよりも良いものは作れないから、皆が使っている そりゃ、フォームはサーバーへ送られて更新されるものだから、 変更可能のフィールドが普通 変更不可のフィールドにするなら、 そのフィールドをサーバーへ送らないようにしないといけない そういうオプションがあるのかな? 「html disabled readonly」で検索! HTML の <input> 要素には disabled と readonly 属性が存在します disabled : コントロールが無効化され、フォームを Submit しても、値の送信が行われない readonly : 値の変更は行えないが、コントロールは有効なので、 フォームを Submit すれば値の送信が行われる 変更不可のフィールドなら、 <input> 要素などを使わずに、単にテキストを表示すれば? >>216 hidden_field使ってもいいけど そもそもformによる入力=webからの入力は信頼してはいけない >>222 直にソースで書くしか! ちなみに、XSRFも調べとくとええんちゃう? マスアサインメント脆弱性を、strong parameters で防ぐ。 更新できる列を、permit で限定する。 これは、コントローラーでの制限 params.require(:person).permit(:name, :age) Action Controller の概要 https://railsguides.jp/action_controller_overview.html モデルでのバリデは、 Active Record バリデーション https://railsguides.jp/active_record_validations.html Rails ガイド・Rails チュートリアル・黒田努の本などを読むか、 YouTube で有名な、雑食系エンジニア・KENTA のサロンへ入ると良い。 日本6位の、2千人入っている、虎の穴 >>217 ブロックで書くとテストコードが書きづらくないですか? 最近はテストコードのことを考えて、普通に、 file = open(file,'r') とか書いてます。 あと、ブロックはネストするからなあ。 >>222 何がしたいのか次第 'hoge'で固定するのであればformで入力させる必要はないですし なんらかの方法で生成するのであれば生成するタイミングを考えます 入力フォーム表示前に生成し固定する必要があるのであれば ActiveSupport::MessageVerifier ActiveSupport::MessageEncrypter session などを使う Rails の便乗質問するけど、 ユーザーの入力値により、条件判断して、 条件1 の場合には、列A だけを更新して、 条件2 の場合には、列B だけを更新する と言うのは、どのように書くの? モデルのcallback かな? ruby silver試験は公式問題集をやれば 合格できますでしょうか、学習時間も参考にさせていただきたいです。 silverを考えています。 バージョンがかなり古いとは思いますが、今のrubyとそんなに変わらないと思ってて大丈夫でしょうか Ruby の資格は、漏れも取っていない。 下のマネーフォワードの本で、良いと思う 改訂2版 Ruby逆引きハンドブック、2018 >>227 自己回答 ユーザーの入力値により、条件判断してはいないけど、 改訂4版 基礎 Ruby on Rails、黒田努・佐藤和人、2018 の400 ページで、 アクションのcreate/update で、 コントローラーのstrong parameters を変える例が書いてある 例えば、下のような感じ params.require(:person).permit(:name) params.require(:person).permit(:age) >>231 別に構わんが環境次第でUnpermittedParameters例外出そうな気がするので @person.update(xxx_params.except(:age)) 的な感じのほうがよいかも pythonなみの公式チュートリアルがあればいいのに Railsでも何でもいいんですが、ecサイトの様なユーザー登録とログインシステム をRubyを使って簡単に構築するライブラリの使い方が書かれている良い本は 有りませんか? >>234 Ruby on Railsのチュートリアル でいいのでは? 簡単に済ませたいならば、 Shopifyとか外部決済システムに外注すれば? スクレイピングしたいんですけど何を勉強すればいいですか 不正アクセスに問われたりしないでしょうか? セキュリティ対策はどのようなことに注意すればよいでしょうか? >>236 踏み台を準備してそこ経由でスクレイピングする >>236 とりあえず、関心のあるページをローカルに保存してnokogiriでアクセスしてみれば? crawler部分とscrap部分を分けるのが吉。 つまり、100pagesをスクレーピングするなら、まずhtmlをblob型でDBにinsertしてから欲しいデータをnokogiriで取り出すのだ。 >>234 よく見るのは、devise gem を使う パーフェクト Ruby on Rails、2020/7 には、載っていない 改訂4版 基礎 Ruby on Rails、黒田努・佐藤和人、2018/9 には少しだけ載っている。 ただし、この本は、Ruby 2.5.1, Rails 5.2 Ruby on Rails 6 実践ガイド、黒田努、2019/12、には載っている ただし、上の黒田努の2冊の本では、devise を使わず、自作している Rails チュートリアル・Rails ガイドも参照 YouTube で有名な、雑食系エンジニア・KENTA のサロンでは、 2千人の未経験者が、Rails の転職用ポートフォリオを作っている。 そこへ入って、聞いた方がよい >>236 サイトのrobots.txt を遵守すること! これを守らないと、営業妨害で逮捕される CSS Selector を勉強する。XPath は勉強しなくてよい。 JavaScript も、jQuery 程度は出来た方がよい gem は、Nokogiri, Selenium Webdriver Udemy の山浦清透、2021/6 【作業工程フル公開】エンジニアが30万円案件の制作過程を公開 www.youtube.com/watch?v=tYbVl6N8oxI PHP のLaravel で、マイナビ転職をスクレイピングして、データベースへ保存する 基本、この動画と同じ。 これを、Ruby on Rails へ置き換えるだけ >>234 Ruby on Rails, devise の動画 Farstep、2019/9 【Rails】deviseを使ったログイン機能の実装(名前でログインする方法を解説) www.youtube.com/watch?v=Lmq_WLkxp9c YouTube で「ruby on rails devise」で検索すれば、日本人の動画も多い Farstep, うるぞー、もぐらストア、 やんばるCODE 守護神・バグ取り名人 たけ >>242 >>サイトのrobots.txt を遵守すること! >>これを守らないと、営業妨害で逮捕される どういうことですか? 詳しくお願いします >>231 パーフェクト Ruby on Rails 【増補改訂版】 (Perfect series)、2020/7 の92 ページで、 コントローラー内で、private メソッドを定義して、 条件によって、strong parameters を変える例が書いてある 管理者・一般ユーザーで変える例 params.require(:user).permit(:name, :admin) params.require(:user).permit(:name) >>247 >>242 に書いてある、山浦清透の動画を見れば分かる 各サイトには、robots.txt が置いてあって、 スクレイピングする場合は、必ず30秒空けるとか、 このフォルダはスクレイピングしてはならないとか、多くの条件が書いてある それを守っていないと、営業妨害になる スクレイピングは初心者向きじゃないので、各サイトと契約して、API を使うべき! なぜかと言うと、初心者のプログラムにはバグが多いから、 無限ループしたりして、サイトへ無限にアクセスしたりする それで、営業妨害で逮捕されるかも知れないから、すごく危険! プロでも、スクレイピングはしない。 必ず、サイトと契約して、APIを使う 5ch もそう。契約して、APIを使えと言ってる。 勝手にスクレイピングすると、訴えてくるかも知れない >>249 私のスクレイピングしたいサイトにはAPIは公開されていません またrobots.txtも設置されていません robots.txtでリクエスト間隔の指定なんてあるのですか? 常識的に数十秒から数分に一回程度のリクエストなら問題ないと思いますが 営業妨害ってどういう意味ですか IT企業に勤める知り合いはスクレイピングで求人を出すことがあると言ってましたが嘘でしょうか? 5chでスクレイピングしたら相手にバレて訴えられることがあるのですか? >>250 あるよ 数分に一回のリクエストで落ちるゴミサイトだろうと、結果的に相手の業務に支障が生じれば業務妨害罪に問われる可能性がある >>250 > 常識的に数十秒から数分に一回程度のリクエストなら問題ないと思いますが > 営業妨害ってどういう意味ですか 誰にとっての「常識」ですか? 某岡崎市の某図書館の「りぶらはっく」の件を知りませんか? (情報リテラシのある側からしたら、) あんな程度のアクセスで逮捕されるわけない「はずだと思う」なのに、 実態は、全部ゾンビ化(作った業者がアレ)していて、 け●さつがわも情報リテラシがなくアレだから、 結果がアレになっちゃったんですよ。 いいですかー、ここは日本です。 訴える側の後ろ側の行政側がアレな場合が多々あり、 情報リテラシがまったくない、矛盾しまくった法治国家なわけですよ。 誰の常識かは、サイトを提供している側が情報リテラシがない場合、その情報リテラシがない前提が常識なわけです。 つまり、その場合、何らかスクレイピングした時点で営業妨害とみなされても仕方ないですよ? >>252 結局その事件は不起訴処分ですよね? なぜ不起訴になったかわかりますか 検察側が有罪に出来ないと判断したからです インターネット業界に携わる者たちからすれば余りにも「一般常識」から外れた言いがかりですからね あなたのような無知蒙昧で従順な子羊は司直にとっては美味しいお客様ですね これからも「常識」に則った素晴らしいプログラムを書き続けてくださいね >>253 もし本当に訴えられたとき、実際の裁判の場で、>>253 と同じ発言を検察側、裁判官の前で弁論できるとよいですね。 まあ不起訴で納得できるならいいんじゃないの? 俺だったら逮捕の時点で嫌だけど 逮捕状は名目上、第三者と言われる司法・裁判所が出している。 本当は警察・検察、つまり行政と結託しているけどw 警察はマスコミにリークして、有罪の世論を作る だから日本では、逮捕 = 100% 有罪。 100%有罪でも、誰もおかしいと思わない。 他国では有罪率が50% ぐらいだけど、日本だけは100% つまり、三権分立していない。 行政が決めてから、司法が行政のやった事を正当化するような判決文を書く。 行政を勝たせた人だけが出世できるから でも、判決文を書くのを極端に嫌がる。 N国みたいな政党が、YouTube で裁判官の判決文を批判したりして、おかしいのがばれるから 不起訴になるのは、犯罪者が認めた場合 青汁王子みたいに検察へ喧嘩を売ったら有罪にされたけど、 徳井みたいに脱税を認めたら、不起訴になった その人がやった事を認めたから、不起訴にした 日本では、逮捕 = 100% 有罪だから、絶対に有罪にできる。 日本では自白をすると、裁判所で何を言っても、くつがえせない。 嘘をついて、自白をするわけがないと言う だから検事は、拷問・家族を脅迫して、自白をさせる 青汁王子みたいに検察の拷問を発表したら、有罪にされた。 それで青汁王子は、検察改革として選挙に立候補するかも知れない 一方、徳井は脱税を認めたら、不起訴になった ZOZO・前澤も、脱税をマスコミにリークされた。 でも、N国が国会で誰がリークしたか聞いたら、皆、白を切った これを国会で追求されたら、まずいから。 警察から、マスコミへリークしているのがばれるから 前澤のは、そもそも脱税でもない。 解釈の違い それを警察がマスコミを使って、青汁王子みたいに悪人に仕立てようとした。 それをN国が国会で質問したから、ばれそうになって白を切った >>257 ちなみに 5chで マルチポストしたら 逮捕されるかもしれないって 知ってた? 逮捕はされないかもしれないけど 自分の悪行を 棚に上げて 正義面したら 地獄へ落ちちゃうよ 閻魔様に 舌を抜かれちゃうんだよ 怖いよ 検察も 警察も 裁判も 怖くないよ 地獄へ落ちると怖いよ 舌を抜かれて 張りの山を登らされて 業火に焼かれるんだよ 熱いよ 痛いよ 怖いよ 別に地獄に落ちるのは怖くないが 昔の人の妄想だし 警察、検察に痛くもない腹を触られるのは怖い 地獄は怖いよ 怖くないって言ってる人 強がり 一番いけないのは 自分のことを棚に上げて 自分が正義だって言う人 地獄へ行くよ 閻魔様に舌を抜かれるよ 痛いよ でも逮捕はされないかもしれな でも地獄の方がもっと怖い 悪魔の証明みたいだが地獄は存在しない 人間は死んだらそこで意識は消滅。無になる。 意識は脳の中の電気信号の集合だから 脳が動かなくなると意識は永遠に消えてなくなる 1. 世界とは事実の総体である。 2. 世界とは<私>の世界である。 2-1. 故に、世界の限界とは<私>の限界である。 2-2. <私>は死なない。視野の端が存在しないように、世界の死は存在しない。 2-2-1. 故に、地獄の存在は事実ではない。 2-2-2. 地獄について語ることはできない。 3. 語りえないことについては沈黙しなければならない。 QED? >>265 その括弧つきの私(<私>)とは何かを十分に説明していませんね‥‥ <私>とは、この私の世界の開闢者。 お前にとっての私ではなく、私にとっての私。 ヒュームが言うところの自我。 地獄を知ってしまったら もう地獄はあるよ 自分のことを棚に上げて 他人をバカにしたら 地獄行きだよ 地獄は怖いよ 自分のことを棚に上げる 一番悪い事 地獄に落ちて 閻魔様に舌を抜かれて 針を飲まされるよ そういうのを信じてくれると 犯罪が減るからべつにいいけど 私は信じていないけど 人に迷惑をかけるのは悪い事 地獄に落ちないかもしれない でも自分のことを棚に上げて 人に迷惑かけたら 地獄に行く 警察もヤクザも 怖くない 地獄は怖いよ スクレイピングは逮捕される危険があるって聞いたんだけどマジ? read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる