Ruby 初心者スレッド Part 62
レス数が950を超えています。1000を超えると書き込みができなくなります。
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
Ruby on RailsについてはWEBプログラミング板で
前スレ
Ruby 初心者スレッド Part 61
https://mevius.5ch.net/test/read.cgi/tech/1503644351/
るりまサーチ (リファレンス検索)
http://rurema.clear-code.com/
Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/
逆引きRuby
http://www.namaraii.com/rubytips/ >>860
いや長文必死にならなくても、お前さんが自分で解説するだけの知力すら無いってのは分かったから。 なんで作者本人が自分で三流ですって言ってるのに、
他人が三流であると解説する必要があるんだ? Java, Ruby のフレームワークを書ける人は、少ない。
山田祥寛(よしひろ)、掌田津耶乃、宮本信二、黒田努など
山田は会社向けの、1日4万円の講座などを開いている
一方、掌田は初心者向け。
Unity, UE4 などのゲームエンジン、
Python などの売れ筋言語、
Spring などのJavaのフレームワーク、
Node.js + Express などのJavaScript のフレームワークなど、万能
山田は会社員、掌田は初心者と、ターゲットが異なる。
もし、同じターゲットなら、両雄並び立たずで、共倒れするから File.open('test.txt', 'r+') do |io|
text = io.read
io.rewind
io.write 'あ'
p io.pos #=> 3
io.truncate io.pos
end
読み書き両用ファイルの、ファイルサイズを減らして、上書きできた
io.rewind で、ファイルポインタを先頭に巻き戻す。
io.truncate io.pos で、現在のファイルポインタの位置で、ファイルを切り詰める 変なこと聞くけどさ、rspecでさ、まあ適当にサンプル書くけど
describe "hoge do
before do
・・・
end
context do
let(:a) { 1 }
・・・
it 'hage' do
expect(a).to be 1
end
end
end
コレに限った話じゃなくて、rspecの使い方で内側のブロック(例えばitの中)から
外側のブロック(例えばcontextの中)の状態(例えば変数)を
書き換えるのを禁止にしても何の問題もないよね?もちろん参照するのはOK。
テストはどう有るべきかを考えたら、むしろそうした方が良いぐらいじゃないかって思うんだけどどうかな? ネストしたcontextで
内側のcontextが外側のcontextで設定した状態を
書き換えるような形でテストを書いても別にいいと思うけどな >>875
でもそうするとテストケース一つとか実行した時におかしくならない? 外部への依存が少なければ、個々のテストの独立性が高いから、
バグが減るし、テストを並行実行できる
それが理想だけど、実現するのは難しそう >>876
おかしくならないよ
let(:a) { 2 }とかで上書きしてみればわかるでしょ >>879
上書き?
letは新たにローカル関数を作るようなもので
親ブロックのaを上書きなんかしてないよ >>880
それ分かってるんなら
何がおかしくなると思ってるの? >>881
内側のブロックで外側のブロックの変数に値を入れた場合だよ Chrome 65 になったら、selenium webdriver が動かなくなったので、
chrome driver 2.37 を、ダウンロードしてみた
これで動くかどうかは、まだ試してないけど 新しいバージョンの、chrome driver にしたら動いた すみません、質問があります。
他人様の書いたコードを読んで写経しながら勉強していた所、
begin
#何らかの処理A(特に例外を出しそうな処理ではない)
end until hoge
という記述があったのですが、この書式の意味というか意図がいまいちつかめなくて困っています。
自分でコードを書いて試してみた所、この記述はhogeがtrueでもfalseでも処理Aを実行しており、
特に「until hoge」の部分で何を制御したいのかがわかりません。
(begin
#処理
end) until hoge
例えば、↑の書き方だと単純なuntil文の後置修飾になるので意味がわかるのですが、
上述のような書式で書く理由や、こう書くとどういうメリットがあるかを教えていただけますと嬉しいです。
よろしくお願いいたします。 >>885
下のAとBは同じことをするんだけど、Aだと1行目と4行目が同じでもやっとするのでBのように書いているのでは
個人的にはbegin〜endをメソッドにしてこうは書かないけど
begin〜end untilのほかにもbegin〜end whileも同様
# A
i = Time.now.sec
until i % 3 == 0
p i
i = Time.now.sec
end
# B
begin
i = Time.now.sec
p i
end until i % 3 == 0 訂正
# A
i = Time.now.sec
p i
until i % 3 == 0
i = Time.now.sec
p i
end
# B
begin
i = Time.now.sec
p i
end until i % 3 == 0 >>887-888
ご回答頂きどうもありがとうございます。
なるほど、この書式だとbegin~end内の処理が1回は必ず実行されて、
その後に条件文で判定されるようになるので、同じ処理(例だと代入処理)を2度書かなくて済むようになるんですね。
とても勉強になりました。
個人的にはコード行数が増えたり同じ処理が連続するよりも、
ひと目で意図する処理が他人に伝わらないのはちょっと嫌なのでこの書き方は真似しないようにします……。 いや、それはおかしい。
リトライやリドゥーみたいな処理で、必要であれば、ためらわずそう書くべき。多少わかりにくくても。
いずれ慣れるから。
なんなら、先頭にコメントをつけとけば。 絶対的なルールではないけどこんなものもあるんで参考までに
ruby-style-guide
>後判定ループの場合、begin/end/untilやbegin/end/whileより、
>break付きのKernel#loopを使いましょう。
https://github.com/fortissimo1997/ruby-style-guide/blob/japanese/README.ja.md#user-content-loop-with-break (なにかしら).method
do
なにかしら
end メソッド
みたいなもんだからRuby規則に沿っているだろ >>891
後判定ループを行うのにbegin-end-while/untilが好ましくない理由を俺に教えて欲しい >>893
英語的にキモいからだろ
end until ってさすがに非ネイティブの俺でも不自然に感じるぞ 英語的な自然さを求めるなら、loopをendのエイリアスということにして loop while/until かな
VBがそんな感じだったはず
まあジャップ製言語だから仕方ないね >>893
beginの中が長いと上から読んでてループするんだかrescueするんだかわかりにくいからじゃない?
ruby-style-guideはコメントを極力書かないで済むようにするのが目的の一つだから
まあ個人的には首肯しかねるルールもいくつかあるけどね >>896
それもあるね
日本人からすると「〜〜(長い長い手続き)〜〜をループさせろ」は自然な流れだけど、
向こうの人からすると「結論から話せやファッキンジャップ」だろうな >>896
ああ、なるほど
そういう観点だったのね
ありがとう ブロッキング条件なら後に来るの自然に感じる
長過ぎるとってのはどんなブロックでも同じ SV
これは第一文型なんだから
文章.method
SをVするで普通の英語じゃん? おいおい…
「を」は対格を作る格助詞だぞ。
記号で書くとV(=verb=動詞)O(=object=目的語)だ。
SVは
S(=subject=主語)V(=verb=動詞)で、
S「が」Vする、だ。 それより>>894だろうな
begin〜end系言語で結びにend whileなんて書くのrubyくらいじゃないか?
たいてい>>895みたいにendを別の単語に変えてる >>889
同じ処理を、別の場所に2回書くと、
修正時に、2か所とも修正しないといけないから、
どちらかを修正し忘れる事があるので、危険 Reuse
Reduce
Recycle
Ruby selenium-webdriver で、Chrome のHeadless mode で、
5ch の投稿者名・書き込み内容を、抜き出してみた
driver.navigate.to "https://mao.5ch.net/test/read.cgi/linux/1479499953/8-9"
elements = driver.find_elements(:css, 'div[data-id]')
elements.each do |elem|
str = elem.attribute('data-id') + ' 投稿者 :'
# CSS では、コンテキストの直下を表現できないので、xpath を使う
# str += elem.find_element(:css, '> div.meta > span.name').text
str += elem.find_element(:xpath => "div[@class='meta']/span[@class='name']").text
puts str
str = '内容 :'
str += elem.find_element(:xpath => "div[@class='message']/span").text
puts str
end 10年以上前に学校でスクリプト言語を勉強してたときはPHPが流行ってて
Perlもあったけど少し古いかなって感じ。ただとにかくJAVAが騒がれててJSP+tomcatなんかもやったな。
Rubyはあったけどそんなに話題にならず。
で最近、またスクライピングがやりたくて色々調べたら
もうPHPも下火?でRubyとpythonとかいう言語が主流みたいですね。 PHPが下火でRubyが主流がねーわ。
人気を捏造しないと好きな言語も恥ずかしくて使えないのか軟弱者め。
たとえ世界の全てが使わなくても自分だけはRubyを使い続けるという気概を持てよ情けない奴 2ch/5chでは、日本人が作ったというだけで、だめ扱いする書き込みがあるから
注意すべし。どこかぞの国から書き込まれている事がある。 以下の半角空白区切りの行から、稼働時間を求めるには、どうやるの?
夜、24:00 以上の数字もあります
2018/09/09 09:45-24:00
2018/10/10 23:00-27:15 >>916
date = "2018/09/09 09:45-24:00"
m = date.match(/(\d\d):(\d\d)-(\d\d):(\d\d)/)[1, 4].map(&:to_i)
min = (m[2] - m[0])*60 + m[3] - m[1]
p "%d:%d" % min.divmod(60) # => "14:15" ありがとう
Date, DateTime, Time などの形で、引算で求められませんか? date = "2018/09/09 09:45-24:00"
m = date.match(%r!\A(?<year>\d{4})/(?<month>\d\d)/(?<day>\d\d) (?<begh>\d\d):(?<begm>\d\d)-(?<finh>\d\d):(?<finm>\d\d)\z!)
beg = Time.new(m[:year], m[:month], m[:day], m[:begh], m[:begm])
fin = Time.new(m[:year], m[:month], m[:day], m[:finh], m[:finm])
min = (fin - beg)/60
p "%d:%d" % min.divmod(60) # => "14:15" ありがとう
24:00 では、Time インスタンスを作れるけど、
27:15 では、エラーで作れなかった
回避策を考えてみます >>920
date = [
"2018/09/09 09:45-24:00",
"2018/10/10 23:00-27:15"
]
begfin = lambda do |m|
d = Time.new(m[:year], m[:month], m[:day])
[[m[:begh], m[:begm]], [m[:finh], m[:finm]]].map { |hour, min|
3600 * hour.to_i + 60 * min.to_i
}
end
date.each do |d|
m = d.match(%r!\A(?<year>\d{4})/(?<month>\d\d)/(?<day>\d\d) (?<begh>\d\d):(?<begm>\d\d)-(?<finh>\d\d):(?<finm>\d\d)\z!)
beg, fin = begfin[m]
min = (fin - beg)/60
puts "%d:%d" % min.divmod(60) # => "14:15"
end
# =>
14:15
4:15
ってマルチかい python スレの書き込みとは別人。
ID も異なるはず
その書き込みを見て、Ruby ではどうプログラミングするべきか、考えてみたが難しかった d = Time.new(m[:year], m[:month], m[:day])
d_next = d + 60 * 60 * 24
24時以上の場合は、hour から24を引いて、1日足すけど、これはややこしい 25以上の数字の入力を許している次点でクソコード。 表計算ソフトなどで、時間管理していると、こういう表記もある。
2018/10/10 23:00-27:15
上を一旦、変換して
2018/10/10 23:00-24:00
2018/10/11 00:00-03:15
これも、1日足すのも結構、難しい。
Date, DateTime に変換してから、1日足さないと、月末・うるう年などで、バグる
>>925
>d_next = d + 60 * 60 * 24
これで1日足すのも、うるう秒の時が、どうなるか不安 時間は最重要項目なんだから
完璧なライブラリとか無いのかな? RubyのDateTimeは充分以上だよ。
日付を増減するときは、それ時分秒の値はさわらずに、めんどくさくても日の値を変更すればいい。 じゃあエポックタイムで十分だな。めんどくさくても計算すればいい。 DateTimeは完璧なライブラリだから24時以降はRangeErrorになる
完璧な仕様だ えーっ、そんなこといちいち書かなきゃいけないのw?rubyなら組込メソッドで一発だよwww
「時間は?」
____
/ \
/ ─ ─\
/ (●) (●) \ 必要ない。計算すればいい
| (__人__) |
\ ` ⌒´ /
,,.....イ.ヽヽ、___ ーーノ゙-、.
: | '; \_____ ノ.| ヽ i
| \/゙(__)\,| i |
> ヽ. ハ | || RubyはUNIX文化だから、時刻はUNIXタイムスタンプを生で扱うのが基本
MRIのコアの連中自身が使ってないから改善されないんだろう 【短命に終わった】国民の祝日.csvをパースして変換するRubyプログラムとコード解説
https://youtu.be/h0WlWPfQ0Sw
伊藤淳一の動画ある Windowsの文字エンコードはどうなってんだよ呪われてるな。 Windowsの文字エンコードはLinux/Unixよりも対応の幅が広い。
まずNT系は古くからUnicode(UTF-16)に対応
Unicode対応アプリであれば全世界で共通に使える
それでいて9x系との互換性のために、Unicodeに対応してないアプリは
それぞれの国のエンコード設定が使用される
その設定はコントロールパネルから変更できるのだが
その変更できる文字コードがLinux/Unixよりも遥かに多い
しかもANSIと互換性がない文字コードでも使用可能 >>943
それはどちらかと言えばコマンドプロンプトの問題なんだが、
WSL対応関係で強化されて、めだった不具合なくなってるよ OneDriveでコード管理していたのだけど、
久しぶりにコーディング(エディタはVSCode)してOneDrive上のRubyファイルを実行しようとしたら
[BUG] Segmentation fault
というエラーがでて、
puts 'A'
というコードさえ実行出来なくなっていた。
ローカルハードディスクに落としたら実行出来たんだけどどうしたものだろう。 そっか。
ありがとうございます。
別にOneDriveをストレージにしても問題ないということだね。
試行錯誤してみます。 GoogleDrive上のRubyファイルは動いた。
何か仕様変更があったのかしら。
ともかく、現状、GoogleDriveでコード管理することにします。 なぜGitを使わないのか
BitBucketなら無料でプライベートリポジトリ持てるぞ AzureならGitはVSTS使うのが普通だろ
AWSならCodeCommit使えば完全無料だ
今時たかがGitのホスティングごときにサーバー運用の手間かけるとか頭悪すぎ じゃあ、これも
Google Cloud Platform でホストされている複数のプライベート Git レポジトリ
https://cloud.google.com/source-repositories/?hl=ja
5ユーザー、50GBストレージ、50GB通信量(下り)まで無料だから
個人用途なら無料で使えそうだね > AWSならCodeCommit使えば完全無料だ
AWSの方は完全無料なのか?って思ったら
やっぱり無料制限あるじゃんw
だいたい一緒みたいね
https://aws.amazon.com/jp/codecommit/pricing/
最初の 5 人のアクティブユーザー
50 GB のストレージ/月
10,000 回の Git リクエスト/月 >>954
実働20日として一人あたり一日平均100コミット?
これ超過できる超人いるのかよ いやコミットじゃなくてプッシュやフェッチか
人間の手動操作なら事実上無制限だな >>956
1 push 1リクエストとは限らんぞ、どういう計算しているか知らんけど、
例えば1 pushに含まれる1ファイルが1リクエストになってるかもしれない
そう考えるとGoogleの方がわかりやすいかもね。 >>957
ファイル単位なら1万くらいcloneや最初のpushで一発で超過するじゃん
一般的な使い方で超過することはめったにないって書いてるからさすがにそれはないだろ >>963
今はgitの話では?
他のことしたいなら、他のもの使えばいいだけだし
gitは○○を使うって話をしてるんだよ >>964
たぶん963は、サーバーをGitだけでなく他の用途にも使うと言ってるんだと思うよ
すごく筋の悪い思考だと思うけどね レス数が950を超えています。1000を超えると書き込みができなくなります。