X



Ruby 初心者スレッド Part 67

0001デフォルトの名無しさん (ワッチョイ b72c-yePO)
垢版 |
2020/12/25(金) 04:24:27.68ID:aa9Khe9z0
プログラミング言語 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
0142デフォルトの名無しさん (ワッチョイ b206-rqav)
垢版 |
2021/04/25(日) 15:44:12.74ID:EAdTvuiP0
>>140
pp知りませんでした。ありがとうございます。かなり頭の中の世界が変わりました。
プロゲートはいまいちだったのでユーデミーの教材漁ってたのですがもう一度プロゲートやり直してみます
0145デフォルトの名無しさん
垢版 |
2021/04/25(日) 17:29:21.56
Excelのsheet1に
A列 B列
1行目 https://www.navitime.co.jp/poi?spot=02022-1220435&;ncm=1  https://rilakkumasabo.jp/shop/%E5%B5%90%E5%B1%B1https://www.telacoya.co.jp/company/shop_detail/shop_detail-130/http://www.arashiyamaryo.or.jp/access/
2行目 https://www.navitime.co.jp/poi?spot=02022-1212380&;ncm=1  https://co-trip.jp/article/191673/https://hitosara.com/ch_478603/https://kyo-soku.com/2020/04/03/salon-de-muge/
3行目 https://www.navitime.co.jp/poi?spot=01125-t100443972s&;ncm=1  https://www.fruitmoti-shoutikudou.jp/https://sweetsguide.jp/product/90706https://osakalucci.jp/shoutikudou
 
と記載されているのを

sheet2に
A列 B列
1行目 https://www.navitime.co.jp/poi?spot=02022-1220435&;ncm=1 https://rilakkumasabo.jp/shop/%E5%B5%90%E5%B1%B1
2行目 https://www.navitime.co.jp/poi?spot=02022-1220435&;ncm=1   https://www.telacoya.co.jp/company/shop_detail/shop_detail-130/
3行目 https://www.navitime.co.jp/poi?spot=02022-1220435&;ncm=1   http://www.arashiyamaryo.or.jp/access/
4行目 https://www.navitime.co.jp/poi?spot=02022-1212380&;ncm=1  https://co-trip.jp/article/191673/
5行目 https://www.navitime.co.jp/poi?spot=02022-1212380&;ncm=1  https://hitosara.com/ch_478603/
6行目 https://www.navitime.co.jp/poi?spot=02022-1212380&;ncm=1 https://kyo-soku.com/2020/04/03/salon-de-muge/
7行目 https://www.navitime.co.jp/poi?spot=01125-t100443972s&;ncm=1  https://www.fruitmoti-shoutikudou.jp/
8行目 https://www.navitime.co.jp/poi?spot=01125-t100443972s&;ncm=1   https://sweetsguide.jp/product/90706
9行目 https://www.navitime.co.jp/poi?spot=01125-t100443972s&;ncm=1  https://osakalucci.jp/shoutikudou

このように変換したいです。オンライン上でRubyを使用して作成したいのですが、どのようにすればよいでしょうか?
0146デフォルトの名無しさん (ワッチョイ 972c-1bRV)
垢版 |
2021/04/25(日) 18:11:40.31ID:oFpMkyEJ0
まず、http://〜、https://〜 を、3つ連結した、

https://http://https://〜 みたいな文字列を、3つに分離する
0147デフォルトの名無しさん (ワッチョイ 6333-gjMA)
垢版 |
2021/04/25(日) 18:37:11.77ID:nrx375qK0
>>145
「オンライン」とは?サーバーでということか?Windows?
Excelはxlsx?csvなら難しくはないが。。。

など、あぶなっかしいところが多すぎ。
初心者がやるにはたいへんやな。w
やめといたら?
0148デフォルトの名無しさん (ワッチョイ 972c-1bRV)
垢版 |
2021/04/25(日) 23:09:08.20ID:oFpMkyEJ0
3つに分離する部分だけを作った。
入出力の部分は、CSV モジュールを使えば?

re = %r!https?://! # 正規表現。http/https
input = String.new( "https://rilakkumasabo.jp/shop/%E5%B5%90%E5%B1%B1https://www.telacoya.co.jp/company/shop_detail/shop_detail-130/http://www.arashiyamaryo.or.jp/access/"; )

positions = [ ]
pos = 0

while md = re.match( input, pos )
positions.push md.begin( 0 ) # 一致した先頭文字h の位置
pos = md.end( 0 ) # 一致した末尾文字/ の次の文字の位置
end

# 文字列の末尾から削除しながら、配列に入れていく
urls = positions.reverse.map { |pos| input.slice!( pos..-1 ) }
pp urls.reverse # 反転

出力
["https://rilakkumasabo.jp/shop/%E5%B5%90%E5%B1%B1";,
"https://www.telacoya.co.jp/company/shop_detail/shop_detail-130/";,
"http://www.arashiyamaryo.or.jp/access/";]
0149148 (ワッチョイ 972c-42zS)
垢版 |
2021/04/26(月) 13:51:09.40ID:0DE0v1OZ0
出来た!
文字列を3分割する部分を関数化して、呼び出す

入出力は、CSV 形式で。
入力ファイルは、input.csv

paiza.IO などで実行してみれば?
ただし、この前、paizaのソースコードが消えてしまったけど。
定期的に消えるのかな?

# 引数の文字列を3分割して、配列に入れて返す
def split_string( input_str )
re = %r!https?://! # 正規表現。http/https

# 下で、slice! で変更するために、破壊的変更可能文字列へ変換する
input = String.new( input_str )

positions = [ ]
pos = 0

while md = re.match( input, pos )
positions.push md.begin( 0 ) # 一致した先頭文字・h の位置
pos = md.end( 0 ) # 一致した末尾文字・/ の次の文字の位置
end

# 文字列の末尾から削除しながら、配列に入れていく
urls = positions.reverse.map { |pos| input.slice!( pos..-1 ) }
urls.reverse # 反転
end

次へ続く
0150148 (ワッチョイ 972c-42zS)
垢版 |
2021/04/26(月) 13:52:06.70ID:0DE0v1OZ0
require 'csv'

result_ary = [ ]

CSV.foreach( "input.csv" ) do |row| # 1行ずつ処理する
split_ary = split_string( row[ 1 ] )

split_ary.each do |url|
result_ary.push [ row[ 0 ], url ]
end
end

# 2次元配列を、CSV 文字列に変換する
csv_str = result_ary.map( &:to_csv ).join
print csv_str
0151デフォルトの名無しさん (ワッチョイ b206-A/Lu)
垢版 |
2021/04/26(月) 22:46:21.55ID:RYaLTPlL0
paramsという名前のハッシュを関数の中で使う際、
:codeの組をhogeだけでなくmoge、kuge、sageなど
関数の引数で選べるようにする場合、
'+ 引数名 +'だとエラーになるようですが、
バリューに引数を使おうとしている事自体が根本的に間違っていますか?
params = {
:code=> 'hoge', ←'+ 引数名 +'だとダメ。ここを入れ替えたい
:page => 1,
:count => 5
}
0153デフォルトの名無しさん (ワッチョイ b206-A/Lu)
垢版 |
2021/04/26(月) 23:08:46.56ID:RYaLTPlL0
>>152
APIを使用して住んでる地域の時間ごとの過去の天気を見る学習をするはずだったのですが
自分でも何がしたいのかわからなくなってきたのでちょっと出直します。
すみませんでした。
0161デフォルトの名無しさん (ワッチョイ 9f5f-woDw)
垢版 |
2021/05/12(水) 10:19:17.28ID:iLdhy1ll0
>>160
require "bundler/inline"
gemfile do
source "https://rubygems.org";
gem "benchmark_driver"
end

Benchmark.driver do |x|
x.prelude %{require "csv"}
x.prelude %{ITEMS = Array.new(1000){ ["fooo", 12345,6789] }}
x.report "to_csv", %{ csv_str = ITEMS.map{ _1.to_csv }.join }
x.report "&:to_csv", %{ csv_str = ITEMS.map(&:to_csv).join }
x.report "generate", %{ csv_str = CSV.generate{|csv| ITEMS.each{|it| csv << it } } }
end

計測すると6倍ほどto_csvの方が遅い事がわかる

to_csvは
https://github.com/ruby/csv/blob/efb257e28f85741fb5c2637f707121e55e4c5ca9/lib/csv/core_ext/array.rb
https://github.com/ruby/csv/blob/efb257e28f85741fb5c2637f707121e55e4c5ca9/lib/csv.rb#L1452
見ると分かるがCSV.new等を毎回行う手抜き実装(バグりにくいというメリットは確かにある)
1行だけならともかく複数行をcsv化したいなら微妙
0164デフォルトの名無しさん (ワッチョイ 9f5f-woDw)
垢版 |
2021/05/12(水) 11:41:45.65ID:iLdhy1ll0
>>162
Benchmark.driver do |x|
x.prelude %{require "csv"}
x.prelude %{require "tempfile"}
x.prelude %{ITEMS = Array.new(1000){ ["fooo", 12345,6789] }}
x.report "to_csv", %{ Tempfile.create{ _1.write ITEMS.map(&:to_csv).join } }
x.report "generate", %{ Tempfile.create{ _1.write CSV.generate{|csv| ITEMS.each{|it| csv << it } } }}
end

確かに縮まりはしたが
うちのオンボロPCでも5倍弱の差が出ました。
0166デフォルトの名無しさん (ワッチョイ dbb7-08Bm)
垢版 |
2021/06/01(火) 17:26:14.50ID:iV+6o72S0
c="C:\Program Files\7-Zip\7z.exe"
p c

で出力は

> "C:Program Files\a-Zip\az.exe"

となってしまうんですが、なんで7がaに変わってしまってるんでしょうか?

2.6.5p114 (2019-10-01 revision 67812) [x64-mingw32]です
0169デフォルトの名無しさん (ワッチョイ 5133-wy77)
垢版 |
2021/06/01(火) 18:56:08.30ID:acqsmkid0
>>166
>>168のシングルクォートよりも、パスの区切り文字を「/」にすることをすすめたい。

パスの区切り文字が「¥」でなければいけないのはコマンドプロンプトなど一部のみ。
だいたいが「/」でも可。
0170デフォルトの名無しさん (ワッチョイ dbb7-08Bm)
垢版 |
2021/06/01(火) 21:37:59.00ID:iV+6o72S0
>>167-169
まとレスにて失礼します

aに置き換わる謎はわかりました
シングルクォートなのですが、面倒くさいことにWindowsの決め打ちで空白が入っているので
それを考えるとダブルクォートで囲まざるを得ず、けっきょくこんな形になってしまいました

c="\"C:\\Program Files\\7-Zip\\7z.exe\""

このあと
system("#{c} a -mx9 ...")
みたいな形で呼び出します
0173デフォルトの名無しさん (ワッチョイ dbb7-08Bm)
垢版 |
2021/06/02(水) 20:29:52.62ID:92rWXivp0
>>171
ああなるほど
それで行けますね
昔は自分でもそんな書き方してたかもしれなかったです

>>172
ご案内ありがとうございます
シングルクォートとダブルクォートの意味とか違いは理解していたのですが
中に\入れたときとか、とくに168さんに指摘されたように8進数での扱いが特別だということは
よく理解していなかったので、これを機会に知識を正確にしておきます
0174デフォルトの名無しさん (ワッチョイ f101-snRc)
垢版 |
2021/06/03(木) 18:27:26.17ID:peqY6uPj0
完全にプログラミング0からで「スラスラ読めるrubyふりがなプログラミング」を買って始めたのですが
macbookairでrbenvでruby3.0.1をダウンロードしてrbenv versionでは3.0.1と表示されるのですがruby -vでは2.6.3と元々入ってるrubyが表示されます
まだ何も分かってないのにhomebrewとrbenvのダウンロードが上手くいかず色々見ながらやってきたので余計な事をしてしまったのではないかと心配です
0176デフォルトの名無しさん (ワッチョイ 8961-szig)
垢版 |
2021/06/05(土) 14:54:45.98ID:uC9Joojh0
Rubyで、syntax error 的なものが生じていても、そのまま実行が続けられている
ように見える現象が時々起きる。
これは何が起きている?
errorが起きた場所で停止させる方法はある?
0179デフォルトの名無しさん (ワッチョイ 8961-szig)
垢版 |
2021/06/06(日) 16:19:02.76ID:1amPE6il0
>>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>'

と出るが、そのまま実行が続けられてしまう。
0189デフォルトの名無しさん (ワッチョイ 8961-szig)
垢版 |
2021/06/07(月) 08:20:47.92ID:Q1HfUOnq0
バグだね。
0192デフォルトの名無しさん (ワッチョイ 152c-3tT5)
垢版 |
2021/06/07(月) 13:15:54.00ID:pl6618+T0
>>170
コマンドプロンプトでも普通に、/ を使える。
これで実行できる

ruby C:/Users/Owner/Documents/a.rb

パスに空白が入っている場合は、シングル・ダブルクォーテーションで囲む

PowerShell(PS)でも良いし。
Windows Terminal なら、Bash, PS、コマンドプロンプトの3つを使える
0194デフォルトの名無しさん (ワッチョイ 152c-3tT5)
垢版 |
2021/06/08(火) 11:47:19.54ID:dOMi6vvz0
そのアプリが、SIG-INT・中断をキャッチしない場合は、
SIG-KILL・強制終了されるのだろう

強制終了は、受け身が取れない。
たぶん、デフォルトの挙動は、そうなのだろう
0204デフォルトの名無しさん (スププ Sdea-mjSI)
垢版 |
2021/06/10(木) 21:34:01.60ID:Hn4s45bFd
現在ラズパイにrubyとpythonを入れて処理を並列に自動実行しようと思ってます
ただ台数が多いため一台ごとにソースを変えるのは回避したいです
なので理想は起動時に最新のソースに自動で更新です
このようなことをしたいときはどのようにするのが一番簡単でしょうか?
rubyでサーバーから最新のソースをコピーしたあとにrubyとpythonを実行?
家で使用するのでセキュリティーとかは気にしません
0207デフォルトの名無しさん (アウアウウー Sa47-565v)
垢版 |
2021/06/23(水) 23:47:46.99ID:vtN99wcma
ライブラリのopenのように、
open() do |f|
・・・
end

と書いてもよく、

f= open()
・・・
f.close

と書いてもいいというクラスor メソッドは
どうやって作ればいいのでしょうか。
yieldを使うとイテレータのみになってしまうし、
returnすると下の例だけになってしまいます。
0210デフォルトの名無しさん (ワッチョイ 3bbb-565v)
垢版 |
2021/06/24(木) 07:56:14.83ID:R0/fGgxp0
すみません、もう一つ教えて下さい。
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メソッド実行
0212デフォルトの名無しさん (ワッチョイ a75f-5d62)
垢版 |
2021/06/24(木) 10:36:21.12ID:5MDZvZ/d0
>>210
close漏れを警戒するのであれば、openにそのままブロックを渡した方がいい
openはブロックの実行結果を返し、ブロック脱出時に勝手にcloseします

まぁ、どうせclose漏れしてもそのうちGCに回収されるかプロセス終了時にcloseされる
0213デフォルトの名無しさん (ワッチョイ 5a01-QZnr)
垢版 |
2021/06/24(木) 11:01:09.55ID:PG/lAwcj0
>>210
yield使った実装とやることは同じ

f= open file
begin
大量の処理を含むメソッド f # <― yieldがメソッドに変わるだけ
ensure
f.close
end

同じだからこそ毎回同じことを書かなくてもいいようblock付きで呼び出す
open(file){|f| 大量の処理を含むメソッド f}
0214デフォルトの名無しさん (アウアウウー Sa47-565v)
垢版 |
2021/06/24(木) 12:31:52.31ID:9bIzV4XCa
大量の処理を手続きオブジェクトに分離するのは、やりました。
やっぱりそれしかないかな。

ブロック付きで渡すのはオブジェクト指向ではない
コードになりやすく、今回は考えてないです。

また、全体をensureで囲うのは、
さすがにensure対象が暗黙的すぎてちょっとな・・・です。
0216デフォルトの名無しさん (ワッチョイ 0d01-++Tn)
垢版 |
2021/07/17(土) 09:58:54.08ID:yHV+uNLK0
railsにおいて あるフォームから特定の変数に送られるデータの内容を固定したいのですがなにかいい方法ありますか?

具体的には
<%= form_with model: @hoge do |form|%>
<%= form.text_field :name , value: 'hoge'%>
<%= form.submit %>
<% end %>
と書かれている場合 hogeというモデルのnameという変数に必ずhogeが入るようにしたいのですが上の書き方だと初期値にhogeが入るだけで編集可能になってしまいます。
0217デフォルトの名無しさん (ワッチョイ 552c-0PSu)
垢版 |
2021/07/17(土) 10:48:14.79ID:xmQE+uIu0
openに、ブロックを渡す方法は、
コンテキスト・マネージャーという、多くの言語で使われているデザインパターン

これよりも良いものは作れないから、皆が使っている
0218デフォルトの名無しさん (ワッチョイ 552c-0PSu)
垢版 |
2021/07/17(土) 10:54:23.38ID:xmQE+uIu0
そりゃ、フォームはサーバーへ送られて更新されるものだから、
変更可能のフィールドが普通

変更不可のフィールドにするなら、
そのフィールドをサーバーへ送らないようにしないといけない

そういうオプションがあるのかな?
0219218 (ワッチョイ 552c-0PSu)
垢版 |
2021/07/17(土) 11:08:32.59ID:xmQE+uIu0
「html disabled readonly」で検索!

HTML の <input> 要素には disabled と readonly 属性が存在します

disabled : コントロールが無効化され、フォームを Submit しても、値の送信が行われない

readonly : 値の変更は行えないが、コントロールは有効なので、
フォームを Submit すれば値の送信が行われる
0220218 (ワッチョイ 552c-0PSu)
垢版 |
2021/07/17(土) 11:15:24.94ID:xmQE+uIu0
変更不可のフィールドなら、

<input> 要素などを使わずに、単にテキストを表示すれば?
0224218 (ワッチョイ 552c-0PSu)
垢版 |
2021/07/17(土) 20:48:35.06ID:xmQE+uIu0
マスアサインメント脆弱性を、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千人入っている、虎の穴
0225デフォルトの名無しさん (ワッチョイ 9dbb-yayT)
垢版 |
2021/07/18(日) 01:26:53.43ID:M+6J3Mfd0
>>217
ブロックで書くとテストコードが書きづらくないですか?

最近はテストコードのことを考えて、普通に、
file = open(file,'r')
とか書いてます。

あと、ブロックはネストするからなあ。
0226デフォルトの名無しさん (ワッチョイ 615f-SRm2)
垢版 |
2021/07/18(日) 15:19:50.46ID:WDHzAXg40
>>222
何がしたいのか次第
'hoge'で固定するのであればformで入力させる必要はないですし
なんらかの方法で生成するのであれば生成するタイミングを考えます
入力フォーム表示前に生成し固定する必要があるのであれば
ActiveSupport::MessageVerifier
ActiveSupport::MessageEncrypter
session
などを使う
0227218 (ワッチョイ 552c-NvNM)
垢版 |
2021/07/18(日) 22:44:25.79ID:H/NN8O820
Rails の便乗質問するけど、
ユーザーの入力値により、条件判断して、

条件1 の場合には、列A だけを更新して、
条件2 の場合には、列B だけを更新する

と言うのは、どのように書くの?

モデルのcallback かな?
0228デフォルトの名無しさん (ワッチョイ 467c-Wyld)
垢版 |
2021/07/19(月) 01:48:34.69ID:0iu7guVA0
ruby silver試験は公式問題集をやれば
合格できますでしょうか、学習時間も参考にさせていただきたいです。
silverを考えています。
バージョンがかなり古いとは思いますが、今のrubyとそんなに変わらないと思ってて大丈夫でしょうか
0229218 (ワッチョイ 552c-NvNM)
垢版 |
2021/07/19(月) 07:03:41.76ID:sO73HNBd0
Ruby の資格は、漏れも取っていない。
下のマネーフォワードの本で、良いと思う

改訂2版 Ruby逆引きハンドブック、2018
0230デフォルトの名無しさん (ワッチョイ b101-E0YB)
垢版 |
2021/07/20(火) 08:12:05.37ID:EkYsR0Mj0
【A型の人ごめん】「まじめ人間」は、自分の人生を生きられず、しかもお金持ちになれない。
https://www.youtube.com/watch?v=ZBSMJHK_b34
【人生観変わる話】「サラリーマン脳」のヤバい特徴5選。
https://www.youtube.com/watch?v=mPCOn0qhW6M&;t=15s
【人生終了】情弱がハマる「貧困スパイラル」のリアル。
https://www.youtube.com/watch?v=T3R71zjbolc
バカでもわかる!ネットビジネスの始め方。
https://www.youtube.com/watch?v=LGM9VxlfDeo&;t=147s
時給労働から卒業しよう!貧乏人が知らない「お金の稼ぎ方」まとめ。
https://www.youtube.com/watch?v=aibytYID1yY
【人生攻略】経験・実績ゼロのあなたが、最短で何者かになる方法。
https://www.youtube.com/watch?v=258RdS9Brxk
【残酷】貧乏人はいつも忙しいのに、お金持ちは暇である理由。
https://www.youtube.com/watch?v=YkRKSgbyyf8
0231218 (ワッチョイ 552c-NvNM)
垢版 |
2021/07/20(火) 10:14:09.06ID:nphTU9tH0
>>227
自己回答

ユーザーの入力値により、条件判断してはいないけど、

改訂4版 基礎 Ruby on Rails、黒田努・佐藤和人、2018
の400 ページで、

アクションのcreate/update で、
コントローラーのstrong parameters を変える例が書いてある

例えば、下のような感じ

params.require(:person).permit(:name)
params.require(:person).permit(:age)
0234デフォルトの名無しさん (ワッチョイ 1161-Y/nI)
垢版 |
2021/07/27(火) 10:21:46.39ID:y9fA4YVt0
Railsでも何でもいいんですが、ecサイトの様なユーザー登録とログインシステム
をRubyを使って簡単に構築するライブラリの使い方が書かれている良い本は
有りませんか?
レスを投稿する


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