[Confidential] © 2013 Actcat, Inc. 1
Ruby用の静的コード解析ツール
ざくっと紹介
[Confidential] © 2013 Actcat, Inc.
はじめに 自己紹介
n プログラマ向けサービス「SideCI」を	
  
開発している角(スミ) です	
  
n エンジニアとしては	
  
Ruby,	
  Obj-­‐C,	
  Android	
  Javaなどが長いです	
  
n 毎月第四水曜日に「新宿.rb」を開催して
ます	
  
2
[Confidential] © 2013 Actcat, Inc.
コードレビュー	
  
してますか?
3
[Confidential] © 2013 Actcat, Inc. 4
PullRequestが届いたよ!	
  
[Confidential] © 2013 Actcat, Inc.
	
  なんでインデントが	
  
タブなんだろう(	
  ・ω・)
5
[Confidential] © 2013 Actcat, Inc.
tmp1,	
  tmp2,	
  v1,	
  v2…	
  
何の変数か分からない(	
  ・ω・)	
  
6
[Confidential] © 2013 Actcat, Inc.
$global1,	
  $global2,	
  @@global3…	
  
(	
  ・ω・)	
  
7
[Confidential] © 2013 Actcat, Inc.
こんな時こそ	
  
8
[Confidential] © 2013 Actcat, Inc.
コードレビューの自動化	
  
9
[Confidential] © 2013 Actcat, Inc. 10
引用	
  
https://houndci.com/
[Confidential] © 2013 Actcat, Inc.
HoundCIの裏側は?
OSSのLintツール・Styleチェックツール	
  
n RuboCop	
  
n CoffeeLint	
  
n JSHint	
  
n SCSS-­‐Lint	
  
n haml-­‐lint	
  
11
[Confidential] © 2013 Actcat, Inc. 12
引用	
  
https://www.sideci.com/
[Confidential] © 2013 Actcat, Inc.
SideCIの裏側は?
n RuboCop	
  
n CoffeeLint	
  
n JSHint	
  
n SCSS-­‐Lint	
  
n haml-­‐lint	
  
n Brakeman	
  
n RailsBestPractices	
  
n Reek	
  
n PHP_CodeSniffer	
  
n PHPMD	
  
13
[Confidential] © 2013 Actcat, Inc.
SideCIを	
  
HoundCIを知っている方に	
  
ざっくり説明すると	
  
14
[Confidential] © 2013 Actcat, Inc.
HoundCI	
  
-­‐	
  haml-­‐lint,	
  SCSS-­‐Lint	
  
+	
  Brakeman,	
  RailsBestPractices,	
  Reek	
  
−	
  $12	
  /month	
  
=	
  SideCI	
  
15
[Confidential] © 2013 Actcat, Inc.
今日紹介したい3つの静的解析ツール
1.  Brakeman	
  
2.  Reek	
  
3.  RailsBestPractices	
  
16
[Confidential] © 2013 Actcat, Inc.
Brakeman
n 個人的に一押しのGem	
  
n Rails用セキュリティスキャナ	
  
n 初心者から、普段Rails使いの方まで
17
[Confidential] © 2013 Actcat, Inc.
コード例	
  
18
[Confidential] © 2013 Actcat, Inc.
Rails	
  Beginnerさんのコードに	
  
たまにあるある	
  
19
[Confidential] © 2013 Actcat, Inc.
Possible SQL injection
Problem	
  Code	
  
	
  User.first(:conditions	
  =>	
  "username	
  =	
  
'#{params[:username]}'")	
  
	
  
Brakeman	
  Scan	
  Result	
  
	
  Possible	
  SQL	
  injection
20
[Confidential] © 2013 Actcat, Inc.
SideCIのコードでも問題	
  
見つかった(´・ω・`)	
  
21
[Confidential] © 2013 Actcat, Inc.
XSS Vulnerability in
ActiveSupport::JSON.encode
There	
  is	
  an	
  XSS	
  vulnerability	
  in	
  the	
  
ActiveSupport::JSON.encode	
  method	
  in	
  Ruby	
  
on	
  Rails.	
  	
  
This	
  vulnerability	
  has	
  been	
  assigned	
  the	
  CVE	
  
identifier	
  CVE-­‐2015-­‐3226.	
  	
  
	
  
Versions	
  Affected:	
  	
  3.0.x,	
  3.1.x,	
  3.2.x,	
  4.1.x,	
  4.2.x.	
  	
  
Not	
  affected:	
  	
  	
  	
  	
  	
  	
  4.0.x.	
  	
  
Fixed	
  Versions:	
  	
  	
  	
  	
  4.2.2,	
  4.1.11	
  	
  
22
Found	
  in	
  Gemfile.lock
[Confidential] © 2013 Actcat, Inc.
JSON.encode	
  使ってる人は	
  
4.2.2以降、4.1.11以降に	
  
アプデしよう!	
  
23
[Confidential] © 2013 Actcat, Inc.
Reek
n コードのSmellを見つけるGem	
  
n Smellは「コードが読みにくい、または保
守しづらい場所を示唆するもの(indicators	
  
of	
  where	
  your	
  code	
  might	
  be	
  hard	
  to	
  read,	
  
maintain	
  or	
  evolve)」	
  
24
[Confidential] © 2013 Actcat, Inc.
コード例	
  
25
[Confidential] © 2013 Actcat, Inc.
ちょっと冗長な感じしない?
26
[Confidential] © 2013 Actcat, Inc.
ちょっと(?)読みづらくない?
27
[Confidential] © 2013 Actcat, Inc.
ネストが深い
1つのメソッドに命令文が多い
28
[Confidential] © 2013 Actcat, Inc.
ちなみに修正後コード
29
[Confidential] © 2013 Actcat, Inc.
Reekの詳細記事と	
  
設定のカスタマイズ	
  
ブログ書いたよ	
  
	
  
Rubyのコードスメルチェックツールreekで
「こんなコードは嫌!」っていうのを防ごう	
  
http://sideci.hatenablog.com/entry/
2015/05/19/161330	
  
30
[Confidential] © 2013 Actcat, Inc.
RailsBestPractices
n コミュニティサイトの投票結果を元
に作られたGem	
  
n Railsのコードのベスト・プラクティスを使
うべきところを見つけてくれる	
  
n わりと面白い。色々出る	
  
31
[Confidential] © 2013 Actcat, Inc.
コード例	
  
32
[Confidential] © 2013 Actcat, Inc.
Always add DB index
*_id系は常にdb index貼ろうよ警告
ActiveRecord::Schema.define(version:	
  
20131103153637)	
  do	
  
	
  	
  create_table	
  "book_authors",	
  force:	
  true	
  do	
  |t|	
  
	
  	
  	
  	
  t.integer	
  	
  "book_id"	
  
	
  	
  	
  	
  t.integer	
  	
  "author_id"	
  
	
  	
  	
  	
  t.datetime	
  "created_at"	
  
	
  	
  	
  	
  t.datetime	
  "updated_at"	
  
	
  	
  end	
  
33
[Confidential] © 2013 Actcat, Inc.
remove empty helpers
空っぽだから消そうね、はい
module	
  ItemsHelper	
  
end	
  
34
[Confidential] © 2013 Actcat, Inc.
3つの静的解析ツール まとめ
1.  Brakeman	
  
l  セキュリティのアップデート情報と
初歩的ミスに役立つ	
  
2.  Reek	
  
l  コードの悪い傾向を検知、予防でき
る	
  
3.  RailsBestPractices	
  
l  Rails特有のbetterな方法について
チェックできる	
  
35
[Confidential] © 2013 Actcat, Inc. 36
紹介した全てのツールで自動的にプルリクを解析、
プルリクに結果をコメントします。	
  
設定の所要時間は30秒,	
  利用料無料。今すぐ!	
  
SideCIをいっしょに作らなイカ?
エンジニア様募集中!	
  

Ruby用の静的コード解析ツールざくっと紹介 by SideCI #omotesandorb

  • 1.
    [Confidential] © 2013Actcat, Inc. 1 Ruby用の静的コード解析ツール ざくっと紹介
  • 2.
    [Confidential] © 2013Actcat, Inc. はじめに 自己紹介 n プログラマ向けサービス「SideCI」を   開発している角(スミ) です   n エンジニアとしては   Ruby,  Obj-­‐C,  Android  Javaなどが長いです   n 毎月第四水曜日に「新宿.rb」を開催して ます   2
  • 3.
    [Confidential] © 2013Actcat, Inc. コードレビュー   してますか? 3
  • 4.
    [Confidential] © 2013Actcat, Inc. 4 PullRequestが届いたよ!  
  • 5.
    [Confidential] © 2013Actcat, Inc.  なんでインデントが   タブなんだろう(  ・ω・) 5
  • 6.
    [Confidential] © 2013Actcat, Inc. tmp1,  tmp2,  v1,  v2…   何の変数か分からない(  ・ω・)   6
  • 7.
    [Confidential] © 2013Actcat, Inc. $global1,  $global2,  @@global3…   (  ・ω・)   7
  • 8.
    [Confidential] © 2013Actcat, Inc. こんな時こそ   8
  • 9.
    [Confidential] © 2013Actcat, Inc. コードレビューの自動化   9
  • 10.
    [Confidential] © 2013Actcat, Inc. 10 引用   https://houndci.com/
  • 11.
    [Confidential] © 2013Actcat, Inc. HoundCIの裏側は? OSSのLintツール・Styleチェックツール   n RuboCop   n CoffeeLint   n JSHint   n SCSS-­‐Lint   n haml-­‐lint   11
  • 12.
    [Confidential] © 2013Actcat, Inc. 12 引用   https://www.sideci.com/
  • 13.
    [Confidential] © 2013Actcat, Inc. SideCIの裏側は? n RuboCop   n CoffeeLint   n JSHint   n SCSS-­‐Lint   n haml-­‐lint   n Brakeman   n RailsBestPractices   n Reek   n PHP_CodeSniffer   n PHPMD   13
  • 14.
    [Confidential] © 2013Actcat, Inc. SideCIを   HoundCIを知っている方に   ざっくり説明すると   14
  • 15.
    [Confidential] © 2013Actcat, Inc. HoundCI   -­‐  haml-­‐lint,  SCSS-­‐Lint   +  Brakeman,  RailsBestPractices,  Reek   −  $12  /month   =  SideCI   15
  • 16.
    [Confidential] © 2013Actcat, Inc. 今日紹介したい3つの静的解析ツール 1.  Brakeman   2.  Reek   3.  RailsBestPractices   16
  • 17.
    [Confidential] © 2013Actcat, Inc. Brakeman n 個人的に一押しのGem   n Rails用セキュリティスキャナ   n 初心者から、普段Rails使いの方まで 17
  • 18.
    [Confidential] © 2013Actcat, Inc. コード例   18
  • 19.
    [Confidential] © 2013Actcat, Inc. Rails  Beginnerさんのコードに   たまにあるある   19
  • 20.
    [Confidential] © 2013Actcat, Inc. Possible SQL injection Problem  Code    User.first(:conditions  =>  "username  =   '#{params[:username]}'")     Brakeman  Scan  Result    Possible  SQL  injection 20
  • 21.
    [Confidential] © 2013Actcat, Inc. SideCIのコードでも問題   見つかった(´・ω・`)   21
  • 22.
    [Confidential] © 2013Actcat, Inc. XSS Vulnerability in ActiveSupport::JSON.encode There  is  an  XSS  vulnerability  in  the   ActiveSupport::JSON.encode  method  in  Ruby   on  Rails.     This  vulnerability  has  been  assigned  the  CVE   identifier  CVE-­‐2015-­‐3226.       Versions  Affected:    3.0.x,  3.1.x,  3.2.x,  4.1.x,  4.2.x.     Not  affected:              4.0.x.     Fixed  Versions:          4.2.2,  4.1.11     22 Found  in  Gemfile.lock
  • 23.
    [Confidential] © 2013Actcat, Inc. JSON.encode  使ってる人は   4.2.2以降、4.1.11以降に   アプデしよう!   23
  • 24.
    [Confidential] © 2013Actcat, Inc. Reek n コードのSmellを見つけるGem   n Smellは「コードが読みにくい、または保 守しづらい場所を示唆するもの(indicators   of  where  your  code  might  be  hard  to  read,   maintain  or  evolve)」   24
  • 25.
    [Confidential] © 2013Actcat, Inc. コード例   25
  • 26.
    [Confidential] © 2013Actcat, Inc. ちょっと冗長な感じしない? 26
  • 27.
    [Confidential] © 2013Actcat, Inc. ちょっと(?)読みづらくない? 27
  • 28.
    [Confidential] © 2013Actcat, Inc. ネストが深い 1つのメソッドに命令文が多い 28
  • 29.
    [Confidential] © 2013Actcat, Inc. ちなみに修正後コード 29
  • 30.
    [Confidential] © 2013Actcat, Inc. Reekの詳細記事と   設定のカスタマイズ   ブログ書いたよ     Rubyのコードスメルチェックツールreekで 「こんなコードは嫌!」っていうのを防ごう   http://sideci.hatenablog.com/entry/ 2015/05/19/161330   30
  • 31.
    [Confidential] © 2013Actcat, Inc. RailsBestPractices n コミュニティサイトの投票結果を元 に作られたGem   n Railsのコードのベスト・プラクティスを使 うべきところを見つけてくれる   n わりと面白い。色々出る   31
  • 32.
    [Confidential] © 2013Actcat, Inc. コード例   32
  • 33.
    [Confidential] © 2013Actcat, Inc. Always add DB index *_id系は常にdb index貼ろうよ警告 ActiveRecord::Schema.define(version:   20131103153637)  do      create_table  "book_authors",  force:  true  do  |t|          t.integer    "book_id"          t.integer    "author_id"          t.datetime  "created_at"          t.datetime  "updated_at"      end   33
  • 34.
    [Confidential] © 2013Actcat, Inc. remove empty helpers 空っぽだから消そうね、はい module  ItemsHelper   end   34
  • 35.
    [Confidential] © 2013Actcat, Inc. 3つの静的解析ツール まとめ 1.  Brakeman   l  セキュリティのアップデート情報と 初歩的ミスに役立つ   2.  Reek   l  コードの悪い傾向を検知、予防でき る   3.  RailsBestPractices   l  Rails特有のbetterな方法について チェックできる   35
  • 36.
    [Confidential] © 2013Actcat, Inc. 36 紹介した全てのツールで自動的にプルリクを解析、 プルリクに結果をコメントします。   設定の所要時間は30秒,  利用料無料。今すぐ!   SideCIをいっしょに作らなイカ? エンジニア様募集中!