RubyKaigi2019
Day1
17:20 - 18:00 GraphQL Migration A Use Case for Metaprigramming?
Square
200 Contorllers
150 Services
200 YAML
GraphQL
different Resources
Highly Diverse
Relational
Introducing GraphQL RoadMap
Existing Model Architecture
Write Graphwl RUby APi
Add metaprogramming to our api
testing
GraphQL Metaprogramming wrap up
Flexible
Reduce Boilerplate
Improved Developer Experience
Day2
企業紹介
ZOZO Technologies
WEAR
.NET, SQL-Server
Railsで本気でリプレイス中
10:00 - 10:40 All bugfixes are incompatibilities
@nagachika
Cruby Committer
RubyGems.org
アカウントがハックされ、悪意あるGemがリリースされてしまった
rubyGems.orgのパスワードリセット、マルチファクタ認証してね
Rubyのブランチモデルについて話す
安定したブランチメンテナンスとはなにか?
rubyのバージョン管理
SVMで管理している
trunkから安定版ブランチにbackportしている
メンテナのいないブランチはEnd Of Lifeを迎える
安定版メンテナの仕事
trunkからのバグ修正を安定版ブランチにbackportする
今日これについて話す
バージョンのリリース管理
security issue系は全てのバージョンにリリースしないといけないので大変
trunkからのバグ修正を安定版ブランチにbackportする
起票されたIssueからすぐにbackportせず、redmineでチケット管理している
安定版メンテナはtrunkでclosedになったissueを普段みている
不具合がどこのバージョンで起きているのか確認する
どのバージョンにbackportすれば良いのか把握するため
backport作業はボランティアとしてメンテナンスしているため、基本1人ずつ安定版バージョンの管理を行っている
どうやったら安定版ブランチメンテナになるか
メンテナには毎年、平均年齢が1年増えるという脆弱性を持っている(みんな歳を取っていく)
次の世代のために話す
必要なこと
継続的な活動ができる見込みがある
Rubyに関する広い知識
メンテナンスポリシーに対する理解がある
メンテナンスポリシーとは
bugfixをtrunkからbackportすること
新規機能/変更はtrunkからbackportしないこと。なんでも
このtrunkの変更がstableに必要だと判断できるかどうかが肝
IO.read()
ファイル、offset, optionを引数に設定
ファイル名のstringに|から始める文字があるとコマンド実行ができる仕様だった
外部からの信頼できない入力によってコマンドを実行してしまう
脆弱性ではないか?
アプリケーションとしては脆弱性だが、Rubyとしては脆弱性ではない認識だった
うっかりやることがあるから、禁止するか、警告を出すべきではないか、議論があった
結果禁止されることはなかった
File.read()
IOを継承しているだけで、実態は同じ
Fileクラスはファイルシステムを扱うものなのに、でコマンド実行できてしまうのは期待していない動きではないか?
2.5.0の直前で起票されていた
今これを直してしまうと、File.readを使っていたユーザーは使えなくなってしまう
段階的な手段を取った
まず2.5.1では警告を出す
2.5.X? でできなくなるようになった
純粋にすぐ直せばよいというわけではない
@nagachikaのbackport reports
2.0.0: 469件
なんでもかんでもbackportしていた
まだ未熟だな @nagachika
2.5.0: 101件
失敗談
Don`t backport performance improvements
2.0.0でパフォーマンス改善をbackportしてしまった
gcを2回やってしまう不具合
バグだが、実質パフォーマンスを改善したということになり、不具合修正ではなかった
パフォーマンス改善はbackport対象ではない
あくまで互換性を保つべき
リリースで、windows版のCIで失敗してしまい、revertすることになった
条件演算子のブロックでメソッドオブジェクトを呼び出すとsyntax errorになった
三項演算子の:を直したら、hashリテラル周りがsyntax errorになった
parser.yは魔境
parser周りは一箇所をテストしているだけだと不具合が漏れてしまう
Load FIFO
FIFOをloadしようとしたらprocess全体がブロックされ、別のスレッドが立たなくなった
他の処理でパフォーマンスが悪くなってしまった
パフォーマンスの問題はbackportの対象外だが、リグレッションなどはrevertの対象
だれも使わない機能のためにbackportしないほうが良い
Be Practical
安定版メンテナは安定したパッケージを提供したいという思いで活動している
How RSpec works
@samphippen
RSpecは大きく、Runner、World、ExampleGroupの3つのコンポーネントで構成されています。ExampleGroupはConfigurationOptionsに渡されたFilterによってfilter outされます
pixtaのツイート
rspec
rspec-core
describe, it, runner, let, etc
rspec-mocks
allow, double, to receive, etc
rspec-expectations
expect keyward and matches
rspec-support
internal code required to make rspec work
rspec-rails
rails specific code
rspec
rspec-code
etc..
just add rspec-rails
runner -> world -> example group
rspec evaluates pattern like spec/**/*.rb
FilterManager
check don`t specify examples
hooks
before{} after{}
expectation
ExpectionTarget
expect().to
Matcher
rspec-mocks
allow
AllowanceTarget
TargetBase
Proxy managers all mocks and stubs for an object
Building a game for the Nintendo Switch using Ruby
@amirrajan
rb_*
C
Simplicity
Ubiquity
Portability
Ruby
a path to necessary complexity
DragonRuby Game Tool Kit
Play with local vars
ruby`s local variable
eval