SlideShare a Scribd company logo
1 of 30
Download to read offline
本当にあった怖い話
7つの幽霊 7つの成仏
2015/09/03(木) 表参道.rb #4
自己紹介
● HN: 神速(@sinsoku_listy)
● 株式会社grooves
● Railsを使える程度の能力
エンジニア向けの転職サービスの
Forkwell Jobs というサイトを作ってます
コードに宿った幽霊・心霊現象
幽霊・心霊現象の紹介
1. 皿屋敷 - お菊の亡霊
2. ドッペルゲンガー
3. ポルターガイスト
4. 既視感 - デジャヴ
5. 日本人形 - 髪が伸びる人形
6. 九死に一生
7. アナフィラキシーショック
1. 皿屋敷 - お菊さん
ある日、何気なくCIサーバーの結果を眺めていると・・・
1. 皿屋敷 - お菊さん
describe ‘テスト’ do
let!(:my_friends) { create_list :friend, 10, with: current_user }
let!(:other_friends) { create_list :friend, 10, with: other_user }
let!(:named_friends) { create_list :friend, 10, with: named_user }
it ‘テスト’ do
# do something
end
...
end
1人、2人・・・友だちが1人足りない・・・
除霊
describe ‘テスト’ do
let!(:my_friends) { create_list :friend, 2, with: current_user }
let!(:other_friends) { create_list :friend, 2, with: other_user }
let!(:named_friends) { create_list :friend, 2, with: named_user }
before { allow(User).to receive(:default_per_page) { 1 } }
it ‘テスト’ do
# do something
end
...
end
10人も友だちは要らない
2.ドッペルゲンガー
とあるクラスに、first_image, second_image, third_image,
fourth_image というカラムがいました。
そして、それぞれ画像アップロード用のクラスで
FirstImageUploader, SecondImageUploader, (ry がいまし
た。
Uploaderのコードをdiffしてみた
$ diff app/uploaders/first_image_uploader.rb app/uploaders/second_image_uploader.rb
2c2
< class FirstImageUploader < CarrierWave::Uploader::Base
---
> class SecondImageUploader < CarrierWave::Uploader::Base
$
約50行が全く同じファイルが4つもあった!
除霊
class CompanyImageUploader < CarrierWave::Uploader::Base
# 共通処理
end
class FirstImageUploader < CompanyImageUploader
end
class SecondImageUploader < CompanyImageUploader
end
リファクタリング: 親クラスの抽出
3.ポルターガイスト
誰も触っていないはずのページが、心霊現象によってカラム落ち
していた。
除霊
width を指定は最低限にして、出来るだけbootstrapのグリッドレ
イアウトなど相対指定をしましょう
4.既視感 - デジャヴ
とあるviewにいたコード
%p= raw obj.html_safe
「raw と html_safe の違いは何だろう・・・?」
4.既視感 - デジャヴ
除霊
Slackで報告したら、弊社の @yachibit が git grep 'raw.
*html_safe' と sed を組み合わせて、一斉除霊したPRを出してく
れた。
参考: html_safe、raw、「<%==」の比較
5.日本人形 - 髪の伸びる人形
localeファイルに追記しようと、ファイルを開くと・・・
5.日本人形 - 髪の伸びる人形
localeファイルに追記しようと、ファイルを開くと・・・
1ファイルが2,200行を超えていた
除霊
localeファイルを分割した。(参考: RailsGuides)
6.九死に一生
CIサーバーのテストが稀によく落ちる。
リトライすると success になるけど、怖いので調査してみた。
6.九死に一生
feature ‘テスト’ do
let(:old_sort_order) { Faker::Number.number(1) }
scenario ‘テスト’ do
# ソート順を変更する処理
expect(page).to_not have_content old_sort_order
end
end
6.九死に一生
feature ‘テスト’ do
let(:old_sort_order) { Faker::Number.number(1) }
scenario ‘テスト’ do
# ソート順を変更する処理
expect(page).to_not have_content old_sort_order
end
end
1/10 で1が出ると、画面内にある +1 の文字と・・・
除霊
feature ‘テスト’ do
let(:old_sort_order) { 1 }
scenario ‘テスト’ do
# ソート順を変更する処理
within ‘.content’ do
expect(page).to_not have_content old_sort_order
end
end
end
7.アナフィラキシーショック
とあるページをリロードすると、2回目の表示はエラーが発生した。
7.アナフィラキシーショック
GET でアクセスするページなのに、 session からデータを消す処
理があり、2回目はエラーに・・・
除霊
できるだけ RESTful にしましょう。
あと、リソースのネストを活用したりもしましょう。
Rails.application.routes.draw do
resources :jobs do
# app/controllers/jobs/companies_controller.rb
resource :company, module: :jobs
end
end
7つの幽霊を成仏させました
次の幽霊が現れないことを祈っています
まとめ
● 怪しい気配がしたら、git grepする
● 手に負えなくなる前に除霊する
● Faker (乱数)は用法・用量を守って使う
ご清聴ありがとうございました

More Related Content

More from sinsoku listy

自己修復的なインフラ -Self-Healing Infrastructure-
自己修復的なインフラ -Self-Healing Infrastructure-自己修復的なインフラ -Self-Healing Infrastructure-
自己修復的なインフラ -Self-Healing Infrastructure-sinsoku listy
 
毎日gemをアップグレードする生活
毎日gemをアップグレードする生活毎日gemをアップグレードする生活
毎日gemをアップグレードする生活sinsoku listy
 
Rails 5.2: credentials
Rails 5.2: credentialsRails 5.2: credentials
Rails 5.2: credentialssinsoku listy
 
Randomly Failing Specs
Randomly Failing SpecsRandomly Failing Specs
Randomly Failing Specssinsoku listy
 
技術的負債とリファクタリング
技術的負債とリファクタリング技術的負債とリファクタリング
技術的負債とリファクタリングsinsoku listy
 
Git 初心者講座 by forkwell
Git 初心者講座 by forkwellGit 初心者講座 by forkwell
Git 初心者講座 by forkwellsinsoku listy
 
ES2015のカバレッジ計測
ES2015のカバレッジ計測ES2015のカバレッジ計測
ES2015のカバレッジ計測sinsoku listy
 
CSSのカバレッジツール
CSSのカバレッジツールCSSのカバレッジツール
CSSのカバレッジツールsinsoku listy
 
Awsでwindowsゲームを動かす
Awsでwindowsゲームを動かすAwsでwindowsゲームを動かす
Awsでwindowsゲームを動かすsinsoku listy
 
Action pack variantsの話
Action pack variantsの話Action pack variantsの話
Action pack variantsの話sinsoku listy
 
LT_Gitのfast fowardと継続的デリバリー
LT_Gitのfast fowardと継続的デリバリーLT_Gitのfast fowardと継続的デリバリー
LT_Gitのfast fowardと継続的デリバリーsinsoku listy
 
バージョン管理とGit
バージョン管理とGitバージョン管理とGit
バージョン管理とGitsinsoku listy
 
Git天空闘技場_ハンズオン
Git天空闘技場_ハンズオンGit天空闘技場_ハンズオン
Git天空闘技場_ハンズオンsinsoku listy
 
20101001 5分でわかるtrac pluginの作り方_slideshare
20101001 5分でわかるtrac pluginの作り方_slideshare20101001 5分でわかるtrac pluginの作り方_slideshare
20101001 5分でわかるtrac pluginの作り方_slidesharesinsoku listy
 

More from sinsoku listy (16)

自己修復的なインフラ -Self-Healing Infrastructure-
自己修復的なインフラ -Self-Healing Infrastructure-自己修復的なインフラ -Self-Healing Infrastructure-
自己修復的なインフラ -Self-Healing Infrastructure-
 
毎日gemをアップグレードする生活
毎日gemをアップグレードする生活毎日gemをアップグレードする生活
毎日gemをアップグレードする生活
 
Rails 5.2: credentials
Rails 5.2: credentialsRails 5.2: credentials
Rails 5.2: credentials
 
Randomly Failing Specs
Randomly Failing SpecsRandomly Failing Specs
Randomly Failing Specs
 
技術的負債とリファクタリング
技術的負債とリファクタリング技術的負債とリファクタリング
技術的負債とリファクタリング
 
Git 初心者講座 by forkwell
Git 初心者講座 by forkwellGit 初心者講座 by forkwell
Git 初心者講座 by forkwell
 
Swift on Docker
Swift on DockerSwift on Docker
Swift on Docker
 
ES2015のカバレッジ計測
ES2015のカバレッジ計測ES2015のカバレッジ計測
ES2015のカバレッジ計測
 
CSSのカバレッジツール
CSSのカバレッジツールCSSのカバレッジツール
CSSのカバレッジツール
 
Awsでwindowsゲームを動かす
Awsでwindowsゲームを動かすAwsでwindowsゲームを動かす
Awsでwindowsゲームを動かす
 
Action pack variantsの話
Action pack variantsの話Action pack variantsの話
Action pack variantsの話
 
LT_Gitのfast fowardと継続的デリバリー
LT_Gitのfast fowardと継続的デリバリーLT_Gitのfast fowardと継続的デリバリー
LT_Gitのfast fowardと継続的デリバリー
 
バージョン管理とGit
バージョン管理とGitバージョン管理とGit
バージョン管理とGit
 
Git天空闘技場_ハンズオン
Git天空闘技場_ハンズオンGit天空闘技場_ハンズオン
Git天空闘技場_ハンズオン
 
DVCSとGitの基礎
DVCSとGitの基礎DVCSとGitの基礎
DVCSとGitの基礎
 
20101001 5分でわかるtrac pluginの作り方_slideshare
20101001 5分でわかるtrac pluginの作り方_slideshare20101001 5分でわかるtrac pluginの作り方_slideshare
20101001 5分でわかるtrac pluginの作り方_slideshare
 

本当にあった怖い話 7つの幽霊 7つの成仏