Ruby 初心者スレッド Part 67

1デフォルトの名無しさん (ワッチョイ 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
2021/04/03(土) 07:31:20.35ID:zsAyk+ZV0
>>111
失礼しました。
ライブラリはWin32OLEです
2021/04/07(水) 17:40:29.80ID:DBwHd1C70
>>110
上はできた。下はダメだった
ちなみに表示が3月30日の場合、find('3/30') はいけたが find('3月30日') はダメ
2021/04/07(水) 19:54:57.14ID:J1UfrlOYa
>>113
え、いけました??
家に帰ったらもう一回やってみます。
教えて頂いてありがとうございます。
115デフォルトの名無しさん (ワッチョイ 7b35-mU/W)
垢版 |
2021/04/09(金) 09:17:30.32ID:+qPfXmCt0
>>17
on ruby rails
と出力されると思いきや、ruby “on ¥n rails”だって。
なんでだ?
Here Documentの仕様ってどうなってんの?
2021/04/09(金) 11:00:25.81ID:9/L6JEXU0
>>115
終端行までなんだから、その前にある改行文字は含まれてあたりまえやろ。
2021/04/09(金) 21:32:27.88ID:GCSyW51k0
ヒアドキュメントの評価値とは別に
#{print "ruby "} で"ruby "とprintされるクソみたいなコードだから
2021/04/09(金) 21:45:43.65ID:PjsXsZBpr
まあなぞなぞみたいなもんでしょ
クソコードとかいったら身も蓋もない
2021/04/09(金) 22:01:43.18ID:pm4fGgmv0
Loggerで出力する内容を奪い取って、他のメソッド呼び出しにするってどう言う実装したらいいですか?

例えば全てをTest::any::log(msg)を内部的に呼び出して終わるみたいなLoggerを作るにはどうしたらいいですか?

Logger.new(STDERR)だと全て標準エラーに出力ですが、これを全てTest::any::log(msg)の呼び出しで標準エラーには何も出さないloggerを作りたいのです
120デフォルトの名無しさん (ワッチョイ 6f2c-ORmy)
垢版 |
2021/04/10(土) 02:35:21.72ID:OA/XTa6K0
C:/Ruby25-x64/lib/ruby/2.5.0/fileutils.rb では、
インスタンス変数に、標準エラーを代入してる

@fileutils_output ||= $stderr
@fileutils_output = $stderr

漏れは、それを真似て、
DryRun の時だけ、noop: true, verbose: true を付けて、
標準出力から標準エラーに切り替えるような、モジュールを作っている

module MyFileUtils
@fileutils_output = $stdout

extend self
def f( *args, **options ) # 配列・ハッシュ
p @fileutils_output
@fileutils_output.puts( args, options )
end

module DryRun
include MyFileUtils
@fileutils_output = $stderr

extend self
def f( *args, **options )
super( *args, **options, noop: true, verbose: true )
end
end
end

MyFileUtils.f( 1, 2, a: 8, b: 9 )
MyFileUtils::DryRun.f( 1, 2, a: 8, b: 9 )
2021/04/10(土) 06:15:13.31ID:OA/XTa6K0
Ruby 逆引きハンドブックには、こう書いてある

Logger.new の引数には、ログファイルパスか、
write, close が定義された、IO などのオブジェクトを指定する
2021/04/10(土) 06:29:33.47ID:OA/XTa6K0
Ruby 逆引きハンドブックには、メソッドオブジェクトも載ってる

def f_a( ) :a end
def f_b( ) :b end

def doit( command )
m = method( command )
m.call
end

def doit_2( command )
__send__ command
end

p doit( :f_a ) #=> :a
p doit_2( :f_b ) #=> :b
2021/04/14(水) 15:02:16.96ID:/0Vt4vuj0
gem installって個別のユーザー環境のみに反映することってできますか?
インストールしたらそのPCを使ってる全ユーザーに反映されないようにしたいです
どうしたらいいですか?
2021/04/14(水) 15:47:13.93ID:0xQQ9slV0
1. 環境変数のGEM_HOMEを指定する
2. --install-dirを指定してインストール
3. --user-installを指定してインストール
4. rbenvを使う

どれでもいける
とりあえずgem help installでヘルプを見るといい
2021/04/14(水) 18:21:50.16ID:/0Vt4vuj0
>>124
ありがとうございます
126デフォルトの名無しさん (ワッチョイ 4652-rqav)
垢版 |
2021/04/23(金) 12:36:53.84ID:j9CkA04K0
{"status"=>0, "data"=>[{"ask"=>"5370001", "bid"=>"5370000", "high"=>"5634576", "last"=>"5371160", "low"=>"5243350", "symbol"=>"BTC", "timestamp"=>"2021-04-23T03:22:36.028Z", "volume"=>"854.3707"}], "responsetime"=>"2021-04-23T03:22:37.031Z"}

このハッシュ?から5370000の値を取り出したいのですが上手くいきません。助けてください
2021/04/23(金) 19:53:44.06ID:gO4UxsH40
>>126
どうやろうとしてうまくいかんの?
128デフォルトの名無しさん (ワッチョイ b206-rqav)
垢版 |
2021/04/23(金) 20:21:10.93ID:v3P9E6mR0
>>127
jsonをパースして変数に入れてbidが持つ値を出力したいのですがnilが返ってきます
2021/04/23(金) 20:36:39.90ID:7NT1P8pu0
>>128
やなくて、コードをはれ。

まあ、たぶんdataが配列なのを見逃して0がぬけてるだけやろ。
dig('data',0,'bid')とか?
130デフォルトの名無しさん (ワッチョイ b206-rqav)
垢版 |
2021/04/23(金) 21:26:36.95ID:v3P9E6mR0
>>129
ヒントを元にそれぞれブラケットで囲ったら行けました。ありがとうございました
2021/04/23(金) 21:33:33.39ID:dol38sZTr
本質的に理解してないやろこれ
132デフォルトの名無しさん (ワッチョイ b206-rqav)
垢版 |
2021/04/24(土) 06:25:40.53ID:+DYpagDZ0
>>131
大変申し訳ありません。digについて理解しました。重ねてありがとうございました。
2021/04/24(土) 15:27:17.38ID:vVXlCGEI0
度々申し訳ないのですが
{"status"=>0, "data"=>[{"amount"=>"0", "available"=>"0", "conversionRate"=>"1", "symbol"=>"JPY"}, {"amount"=>"0", "available"=>"0", "conversionRate"=>"5377836", "symbol"=>"BTC"}], "responsetime"=>"2021-04-24T06:14:41.169Z"}
ここから5377836を出力する場合も理解さえできればdigでいけるのですか?

今のコード
r_hash = JSON.parse(response.body)
puts r_hash["data"][1]["conversionRate"]
# =>"5377836"
できれば覚えたてのこれ使いたい↓
puts response_hash = dig("data",ここわからない,"conversionRate")
134デフォルトの名無しさん (ワッチョイ 7d2d-Im0W)
垢版 |
2021/04/24(土) 16:46:14.63ID:j3qP/sr70
ブラケットで書くのと同じだよ
r_hash["data"][1]["conversionRate"]
r_hash.dig("data", 1, "conversionRate")
2021/04/24(土) 22:29:45.06ID:+DYpagDZ0
>>134
ありがとうございます。無事取れたのですが引数が頭の中でぐるぐるしてるのでもう一度リファレンス見てきます
2021/04/24(土) 22:33:17.78ID:rJwQsTRc0
つーか、リストとハッシュについての理解が足りないんちゃうか?
インデックスとかキーとかの感覚がわからんのやろ。
2021/04/24(土) 22:56:02.00ID:+DYpagDZ0
>>136
おっしゃる通りです。{[{}{}]}
この形で返ってくるともう何がなんだか
2021/04/25(日) 10:27:13.97ID:IoXyqRUD0
配列の添え字(数字)が文字列になっただけだよ
添え字が数字じゃないので一づつ増やすことはできないけど
2021/04/25(日) 13:07:39.95ID:EAdTvuiP0
>>138
アドバイスありがとうございます。悲しいくらい今日も予定がないので学習のため一個ずつ値を呼び出して確認してみます。
2021/04/25(日) 13:30:05.13ID:M6swdTrH0
>>139
知ってるかもしれないけど
この手のは p よりも pp で表示するとわかりやすいよ
Ruby 2.5以降は requireしなくても最初から pp が使える
2021/04/25(日) 13:55:29.69ID:oFpMkyEJ0
初心者は、dot install, progate などをやれば?
2021/04/25(日) 15:44:12.74ID:EAdTvuiP0
>>140
pp知りませんでした。ありがとうございます。かなり頭の中の世界が変わりました。
プロゲートはいまいちだったのでユーデミーの教材漁ってたのですがもう一度プロゲートやり直してみます
2021/04/25(日) 15:53:02.64ID:I4PgyU7Gr
マニュアル読めと言うのは初心者には酷か?
https://docs.ruby-lang.org/ja/latest/doc/index.html
2021/04/25(日) 16:58:50.92ID:oFpMkyEJ0
本が好きなら、定番の入門書「たのしいRuby 第6版」2019 とか

YouTube で有名な、雑食系エンジニア・KENTA のサロンは皆、Ruby on Rails じゃないの?
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を使用して作成したいのですが、どのようにすればよいでしょうか?
146デフォルトの名無しさん (ワッチョイ 972c-1bRV)
垢版 |
2021/04/25(日) 18:11:40.31ID:oFpMkyEJ0
まず、http://〜、https://〜 を、3つ連結した、

https://http://https://〜 みたいな文字列を、3つに分離する
2021/04/25(日) 18:37:11.77ID:nrx375qK0
>>145
「オンライン」とは?サーバーでということか?Windows?
Excelはxlsx?csvなら難しくはないが。。。

など、あぶなっかしいところが多すぎ。
初心者がやるにはたいへんやな。w
やめといたら?
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/";]
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

次へ続く
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
2021/04/26(月) 22:46:21.55ID:RYaLTPlL0
paramsという名前のハッシュを関数の中で使う際、
:codeの組をhogeだけでなくmoge、kuge、sageなど
関数の引数で選べるようにする場合、
'+ 引数名 +'だとエラーになるようですが、
バリューに引数を使おうとしている事自体が根本的に間違っていますか?
params = {
:code=> 'hoge', ←'+ 引数名 +'だとダメ。ここを入れ替えたい
:page => 1,
:count => 5
}
2021/04/26(月) 22:54:52.82ID:rfpJ92nWr
意味が分からん。
エラーになるコードと希望する出力は何?
2021/04/26(月) 23:08:46.56ID:RYaLTPlL0
>>152
APIを使用して住んでる地域の時間ごとの過去の天気を見る学習をするはずだったのですが
自分でも何がしたいのかわからなくなってきたのでちょっと出直します。
すみませんでした。
2021/04/26(月) 23:31:12.51ID:rfpJ92nWr
>>153
おう、がんばれ
2021/04/27(火) 00:08:05.54ID:6stPm5Ss0
>>151
変数名と値(リテラル)の区別があやふやなんでは?
変数名をクォートしようとしている時点でヤバイ。
2021/04/27(火) 16:05:13.93
>>148-150
ありがとうございます。
rubyのインストールが上手く出来なかったので明日またやってみます。
2021/04/28(水) 22:23:58.72
145です。
出来ました。ありがとうございます。
2021/04/30(金) 21:24:36.83ID:DJ/L1TU20
>>150
Array#to_csvってかなり非効率的なんで避けたほうが無難
csv_str = CSV.generate{|csv| result_ary.each{|it| csv << it } }
2021/05/03(月) 11:06:41.86ID:B6Xr9eKd0
Pythonみたいに行けてるエクセルライブラリが欲しい。。
2021/05/12(水) 09:35:54.83ID:NUn3zAQRa
>>158
非効率というのは遅いって事ですか?
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化したいなら微妙
2021/05/12(水) 11:11:15.22ID:heOXda5CM
実際にはどうせファイルに書き込むんだからファイルIOがボトルネックになるんで誤差だよ
無意味なベンチマークだね
2021/05/12(水) 11:18:11.79ID:VEm96Egx0
>>162
キャッシュなしフロッピーディスク💾を使ってるのかな?w
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倍弱の差が出ました。
2021/05/12(水) 22:35:04.85ID:gVUbVQ8ua
何秒が何秒になったんですか?
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]です
2021/06/01(火) 17:31:29.95ID:DkdlQ1eQ0
https://ja.wikipedia.org/wiki/ベル文字
> ベル文字は、ASCIIとUnicodeでは十進数で7
> 1972年に作られたC言語では、ベル文字は文字定数 \aで表される。'a'は"alert"や"audible"の頭文字である。'b'は既にバックスペースに使われていた。
2021/06/01(火) 18:04:34.76ID:uwqmKkHK0
>>166
バックスラッシュ記法で8進数表記のパターンとして解釈されるから
式展開が必要なければシングルクウォートにするといい
https://docs.ruby-lang.org/ja/3.0.0/doc/spec=2fliteral.html#backslash

¥007も¥07も¥7も同じ
C言語由来のエスケープシーケンス
2021/06/01(火) 18:56:08.30ID:acqsmkid0
>>166
>>168のシングルクォートよりも、パスの区切り文字を「/」にすることをすすめたい。

パスの区切り文字が「¥」でなければいけないのはコマンドプロンプトなど一部のみ。
だいたいが「/」でも可。
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 ...")
みたいな形で呼び出します
2021/06/01(火) 22:03:40.90ID:eWE6r8CI0
>>170
c = '"C:\Program Files\7-Zip\7z.exe"'
2021/06/02(水) 19:46:00.37ID:onKqKKZNr
>>170
すごく短くまとまってるから、一度公式のリファレンス読んだ方がいいよ
https://docs.ruby-lang.org/ja/latest/doc/spec=2fliteral.html#string
2021/06/02(水) 20:29:52.62ID:92rWXivp0
>>171
ああなるほど
それで行けますね
昔は自分でもそんな書き方してたかもしれなかったです

>>172
ご案内ありがとうございます
シングルクォートとダブルクォートの意味とか違いは理解していたのですが
中に\入れたときとか、とくに168さんに指摘されたように8進数での扱いが特別だということは
よく理解していなかったので、これを機会に知識を正確にしておきます
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のダウンロードが上手くいかず色々見ながらやってきたので余計な事をしてしまったのではないかと心配です
2021/06/03(木) 18:56:51.38ID:peqY6uPj0
>>174ですが
自己解決しました
bash profileに何か誤ったものを書き込んでしまったようで消したら3.0.1に切り替わりました
2021/06/05(土) 14:54:45.98ID:uC9Joojh0
Rubyで、syntax error 的なものが生じていても、そのまま実行が続けられている
ように見える現象が時々起きる。
これは何が起きている?
errorが起きた場所で停止させる方法はある?
2021/06/05(土) 15:26:37.54ID:SGijWivar
rescue SyntaxError
2021/06/05(土) 20:10:36.75ID:K+vX0E1p0
>>176
そのエラーが起こった時に何が表示されているの?
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>'

と出るが、そのまま実行が続けられてしまう。
2021/06/06(日) 17:06:19.62ID:B1fTG1Q6r
>>179
begin
rescue
end
の構造してるだけじゃないの
2021/06/06(日) 17:09:33.22ID:1amPE6il0
>>180
そういうものは使ってない。
2021/06/06(日) 17:12:50.30ID:B1fTG1Q6r
>>181
再現するコードを共有することはできますか?
2021/06/06(日) 17:37:47.34ID:1amPE6il0
>>182
できない。
大事なコードだから非公開。
2021/06/06(日) 17:44:51.53ID:B1fTG1Q6r
そうであれば我々にはわかりえない。
まあどっかでrequireをオーバーライドしてるとかじゃないの。
2021/06/06(日) 18:17:08.76ID:1amPE6il0
>>184
全部自分で書いたコードで、Rubyの基本的な機能しか使ってない。
また、検索してみたが、begin や rescue というキーワードは全く使ってなかった。
2021/06/06(日) 21:13:38.74ID:kq17Ee/S0
別スレッドも停止させたいのであれば、Thread.abort_on_exception=trueが必要とか?
2021/06/06(日) 22:12:59.95ID:1amPE6il0
>>186
シングルスレッドしか使ってない。
2021/06/06(日) 23:44:17.52ID:///+rfU80
もうええて。
追加情報がなきゃあもうムリやろ。
189デフォルトの名無しさん (ワッチョイ 8961-szig)
垢版 |
2021/06/07(月) 08:20:47.92ID:Q1HfUOnq0
バグだね。
2021/06/07(月) 12:05:22.54ID:Qb3DiLXp0
さすがのRubyでも、そんなアホみたいな「バグ」なんかないやろ。w
2021/06/07(月) 13:11:30.61ID:tJ2RoPVV0
おまえさん一人だけの症状なんだし再現できるコード・環境を出せない以上おま環
2021/06/07(月) 13:15:54.00ID:pl6618+T0
>>170
コマンドプロンプトでも普通に、/ を使える。
これで実行できる

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

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

PowerShell(PS)でも良いし。
Windows Terminal なら、Bash, PS、コマンドプロンプトの3つを使える
2021/06/08(火) 10:27:31.04ID:ljhkY4kR0
Powershellで標準出力をリダイレクトしてると
Ctrl-C押した時at_exitに飛ばずに死ぬの何なの?
2021/06/08(火) 11:47:19.54ID:dOMi6vvz0
そのアプリが、SIG-INT・中断をキャッチしない場合は、
SIG-KILL・強制終了されるのだろう

強制終了は、受け身が取れない。
たぶん、デフォルトの挙動は、そうなのだろう
2021/06/08(火) 12:46:57.32ID:ljhkY4kR0
リダイレクトしていなければ普通にat_exitに飛ぶんだよ
2021/06/08(火) 14:00:54.76ID:8dk2g5lI0
試しにpythonでもatexit使ってみたが同様に強制終了される
Traceback出力されるのにatexitは実行されない
2021/06/08(火) 14:04:16.61ID:xXGg8olZ0
Rubyスレなんだが!
2021/06/08(火) 14:34:31.00ID:8dk2g5lI0
powershellがバグってる
cmd /c 経由なら正常にリダイレクトおよびctrl+cできたわ
2021/06/08(火) 14:44:58.07ID:ljhkY4kR0
え〜〜マジっすか

検証してくれてありがとうございました。
2021/06/08(火) 17:51:22.97ID:ljhkY4kR0
まずパイプが終了して、それに巻き込まれてpythonのプロセスが落ちるとかなんとか
rubyの挙動を調べるためにpythonでググるってなんだかな
2021/06/08(火) 20:59:45.11ID:7WqSN2WLr
そういやパイプ周りの不具合がなんかあったな
2021/06/08(火) 21:13:49.57ID:7WqSN2WLr
と思ったら今回の件と何も関係が無かったわ。

https://bugs.ruby-lang.org/issues/14245
2021/06/08(火) 21:15:32.86ID:S62X2+fs0
>>159
ほんと、これは甚だ同意。
2021/06/10(木) 21:34:01.60ID:Hn4s45bFd
現在ラズパイにrubyとpythonを入れて処理を並列に自動実行しようと思ってます
ただ台数が多いため一台ごとにソースを変えるのは回避したいです
なので理想は起動時に最新のソースに自動で更新です
このようなことをしたいときはどのようにするのが一番簡単でしょうか?
rubyでサーバーから最新のソースをコピーしたあとにrubyとpythonを実行?
家で使用するのでセキュリティーとかは気にしません
2021/06/10(木) 22:40:14.97ID:t0oieqtV0
>>204
rsyncすれば?
2021/06/18(金) 09:43:06.27ID:Jo75oGSbM
>>204
厳密に一斉に切り替わらなくてもいいならcronとかで定期的にGitHubからpullする
手段が目的だと堂々と言えるならKubernetesのクラスタ組むとかも面白い
2021/06/23(水) 23:47:46.99ID:vtN99wcma
ライブラリのopenのように、
open() do |f|
・・・
end

と書いてもよく、

f= open()
・・・
f.close

と書いてもいいというクラスor メソッドは
どうやって作ればいいのでしょうか。
yieldを使うとイテレータのみになってしまうし、
returnすると下の例だけになってしまいます。
2021/06/24(木) 00:15:52.97ID:PG/lAwcj0
if block_given? で分岐
2021/06/24(木) 07:40:00.21ID:R0/fGgxp0
>>208
ありがとうございます。
うまく作れました。
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メソッド実行
2021/06/24(木) 09:32:39.75ID:+4IsK47J0
>>210
大量の処理を関数にして分離。
あるいは、しょせん理想でしかないので、離れていても気にしない。
レスを投稿する