Rabbit Slide Show

TokyuRubyKaigi12

Description

Text

Page: 1

Rubyにpatchを
送ってみよう!
2018-07-29 at 株式会社VOYAGE GROUP
TokyuRuby会議12
うなすけ

Page: 2

自己紹介
名前 : うなすけ
所属 : 株式会社バンク (エンジニア)
インフラ寄りサーバーサイドエンジニア
GitHub @unasuke
Twitter @yu_suke1994
Mastodon @unasuke@mstdn.maud.io

Page: 3

最近
寝転がったままパソコンを使う | うなすけとあれこれ

Page: 4

tqrk12

Page: 5

tqrk12

Page: 6

はい
はい

Page: 7

Rubyにpatchを送る
どうやって?
SVNわかんない……
C言語わかんない……
そもそも送るネタがない
私に直せるバグなんてある?
新機能なんて思いつかないし……

Page: 8

Rubyにpatchを送る
どうやって?
SVNわかんない…… ←それな
C言語わかんない…… ←それな
そもそも送るネタがない
私に直せるバグなんてある? ←それな
新機能なんて思いつかないし…… ←それな

Page: 9

Rubyにpatchを送った
ぼくのばあい

Page: 10

bank/karakuri_ai-ruby
https://github.com/bank/karakuri_ai-ruby

Page: 11

bank/karakuri_ai-ruby’s gemspec
spec.add_development_dependency
spec.add_development_dependency
spec.add_development_dependency
spec.add_development_dependency
"bundler", "~> 1.16"
"rake", "~> 10.0"
"minitest", "~> 5.0"
"webmock"
karakuri_ai-ruby/karakuri_ai.gemspec at master ·
bank/karakuri_ai-ruby · GitHub
runtime_dependencyがない!
標準ライブラリのみを使用している

Page: 12

net/http のみで実装するAPI Client Gem
動機
無駄に依存を増やしたくない
Faraday
httparty
etc…
https://postd.cc/kill-your-dependencies/
標準ライブラリのお勉強

Page: 13

net/http のみで実装するAPI Client Gem
機能
認証
JSONをPOROにmapping
エラーが返ってきたら例外 ← ここ

Page: 14

Net::HTTPResponse#value
class Net::HTTPResponse (Ruby 2.5.0)
レスポンスが 2xx(成功)でなかった場合に、対応
する 例外を発生させます。
オッ、便利か〜〜???

Page: 15

Net::HTTPResponse#value
class Net::HTTPResponse (Ruby 2.5.0)
[EXCEPTION] HTTPServerException:
レスポンスが 4xx である場合に発生します。

Page: 16

HTTP status code
The 4xx class of status code is intended for
cases in which the client seems to have
erred.The 4xx class of status code is intended
for cases in which the client seems to have
erred.
https://www.w3.org/Protocols/rfc2616/rfc2616-
sec10.html
400系はクライアントが悪い場合……だよね?

Page: 17

Net::HTTPResponse#value
class Net::HTTPResponse (Ruby 2.5.0)
[EXCEPTION] HTTPServerException:
レスポンスが 4xx である場合に発生します。
間違ってるのはどっち?
Ruby Net::HTTPResponse#value
俺

Page: 18

困ったときの

Page: 19

困ったときの Asakusa.rb
usa-san says…
これは仕様のバグですね
間違ってるのはどっち?
Ruby Net::HTTPResponse#value ← こっち
俺

Page: 20

なおす
なおす
SVNわかんない……
C言語わかんない……

Page: 21

なおす
なおす
SVNわかんない……
使うのはgitだけ
C言語わかんない……
(今回)書くのはRuby
やっていきましょう

Page: 22

なおし手順
1. cloneする
2. grepする
3. みつける
4. 書き換える
5. testを回す
6. bugs.ruby-lang.orgに投稿
7. 待つ

Page: 23

なおし手順 - cloneする
git cloneでダイジョウブ
https://github.com/ruby/ruby.git ← オススメ
https://git.ruby-lang.org/ruby.git

Page: 24

なおし手順 - grepする
$ git grep HTTPServerException
lib/net/http/exceptions.rb が怪しい!
# lib/net/http/exceptions.rb
module Net::HTTPExceptions
def initialize(msg, res)
#:nodoc:
super msg
@response = res
end
attr_reader :response
alias data response
#:nodoc: obsolete
end
### snip ###

Page: 25

なおし手順 - みつける
class Net::HTTPServerException < Net::ProtoServerError
# We cannot use the name "HTTPServerError", it is the name of the response.
include Net::HTTPExceptions
end
https://github.com/ruby/ruby/blob/v2_5_1/lib/net/
http/exceptions.rb#l19-l22
ここだ〜〜〜〜

Page: 26

なおし手順 - 書き換える
単純に名前を換えるのヤバそう
この例外の名前を使ってるコードがぶっ壊れ
alias という便利機能があるっぽい
https://docs.ruby-lang.org/ja/latest/doc/
spec=2fdef.html#alias
Rubyってすごいな〜〜

Page: 27

なおし手順 - 書き換える
しかしこういうことはできない!
alias Net::NiceExceptionName Net::HTTPServerException
これならできる
module Net
alias NiceExceptionName HTTPServerException
end

Page: 28

なおし手順 - 書き換える
結局こうした
# for compatibility
Net::HTTPClientException = Net::HTTPServerException
usaさんが代入すればいい的なことをおっしゃってたので……

Page: 29

なおし手順 - testを回す
変更してtestが通るか確認
make check
なんならテストも書き換える
# test/net/http/test_httpresponse.rb
res = Net::HTTPResponse.read_new(io)
assert_equal(nil, res.message)
-
assert_raise Net::HTTPServerException do
+
assert_raise Net::HTTPClientException do
res.error!
end
end

Page: 30

なおし手順 - bugs.ruby-lang.orgに投稿
1. ユーザー登録する
2. チケット → 「新しいチケット」をクリック
3. 思いの丈をぶつける
Feature #14688: Net::HTTPResponse#value raises
“Net::HTTPServerException” in 4xx response - Ruby
trunk - Ruby Issue Tracking System

Page: 31

なおし手順 - 待つ
open 04/15 → close 06/06
約2ヶ月
きっかけはnaruseさんに直に相談
「会える」は強い
みんな暇じゃない

Page: 32

my patch approved!

Page: 33

Rubyにpatchを送る
どうやって?
SVNわかんない……
使うのはgitだけ
C言語わかんない……
領域による

Page: 34

Rubyにpatchを送る
そもそも送るネタがない
私に直せるバグなんてある?
新機能なんて思いつかないし……

Page: 35

Rubyにpatchを送る
https://twitter.com/mametter/status/
1022848181590052864

Page: 36

Rubyにpatchを送る
テストやリファクタリングを頑張るコミッタは
あんまいない

Page: 37

Rubyにpatchを送る

Page: 38

Rubyにpatchを送る
そもそも送るネタがない
私に直せるバグなんてある?
不足しているテストを書くとよさそう
新機能なんて思いつかないし……
(今)思いつかなくてもいいのでは
あせらない、あせらない

Page: 39

Ruby communityにpatchを送る
ruby/rubyだけがRubyじゃない
「Rubyist」という言葉は造語で、Rubyに対し
て単なるお客さん以上の気持を持っている人が
Rubyistです。
rurema/doctree
rubima/magazine.rubyist.net
many rubygems…

Page: 40

まとめ
Ruby 2.6には僕のpatchが含まれてます
Rubyにpatchを送るには
gitの知識で十分
GitHubにpull requestを送るのでもOK
We are Rubyist!

Other slides