pfff id : ymotongpoo 1
Dec 18, 2014
pfff id : ymotongpoo
1
2
まずはじめに 言っておきたい ことがある
3
pfffがうまく動かねえのは 俺のせいじゃねえ!
id : ymotongpoo
4
お前、誰よ? • Sphinx-Users.jp 賑やかし担当
• 所属
• 翻訳とかしてます – Redis, Jinja2, Tornado...
• YAMAGUCHI::weblog – http://d.hatena.ne.jp/ymotongpoo/
5
6
告知
7
#3 Organizer @moriyoshi @AE35 @MiCHiLU @ikasamt @ymotongpoo
いつやるか全然決まってねえ!
8
気をとりなおして
9
今日は Python Hackathon
なので
10
の話をすると思っただろ
11
OCaml製の PHP用ツール の話をします
12
pfffの話をします ぷ ふ
13
で、pfffってなによ?
14
“Analyzer for code base”
建前
15
コードの雰囲気を見て いい感じか知るツール群
建前
関連ツール
• ctags/gtags ‒ タグ作成 • cscope ‒ C用ソースコードブラウザ • lxr ‒ インデックス作成
16
建前
17
作者のOCamlへの愛とテンションで作られてる、聞こえがいいけど全然動かない物
実際
18
最初にひとつだけ 大事なことを お伝えしておきます
19
最新版&Mac OS上では ビルド出来ない/buggy なのでLinux環境あるならそこでやれ!
20
じゃあLinuxで やるとして
pfff Pre-requisition
• OCaml 3.11.0以降 (3.11.2推奨) • PCRE • GTK2+ • cairo2 • pango
21
対応する言語 • PHP • OCaml • JavaScript • C • C++ • Java • Tex • Noweb
22
• Lisp • Scheme • Haskell • Erlang • C# • Python • SQL • Ruby
23
「おお、すげえ」と思うじゃないですか
将来対応するかもしれない言語 • PHP • OCaml • JavaScript • C • C++ • Java • Tex • Noweb
24
• Lisp • Scheme • Haskell • Erlang • C# • Python • SQL • Ruby
対応してる言語 • PHP • OCaml • JavaScript • C • C++ • Java • Tex • Noweb
25
• Lisp • Scheme • Haskell • Erlang • C# • Python • SQL • Ruby
26
とりあえず PHPしかまともに 対応してない
27
もとい
28
なのでPHPに 注力しています
pfffの構成ツール
• pfff ‒ テストツール • pfff_db ‒ 簡単なコード解析/DB作成 • codemap ‒ コードの雰囲気可視化 • sgrep ‒ 構文を考慮したgrep • spatch ‒ 構文を考慮してpatch • scheck ‒ コード上のミスを発見 • stags ‒ ETAGSより詳細なタグ
29
pfff
• コードの静的解析ツール • 文法的に間違ってないか確認してくれる
30
$ pfff -parse_php <dir or file>
sgrep
• 構文を考慮したgrep • 例)
31
$ sgrep -e ‘strstr(...) == false’ *.php
$ find . ‒name *.php | xargs grep ‘strstr(...) == false’
とどう違うの?
sgrep
• 構文を考慮してくれる
32
$ sgrep -e ‘foo(..., 1, ...)’ *.php
$hoge = $a-‐>foo($spam, 1, $egg) // これは普通 $hoge = $a-‐>foo($spam, // 複数行でもOK 1, $egg)
spatch
• 構文を考慮してくれるpatch • パッチはこんな感じに書く
33
//remove_second_arg_foo.spatch foo(X - ,Y ) // remove_second_arg_foo_alt.spatch -‐ foo(X,Y) + foo(X)
spatch
• パッチを当てる
34
$ spatch -c <patch> *.php
scheck
• コード上のバグ発見ツール
• PHPやJavaScriptなど、初期化されてないような変数を直接呼んじゃえるような場合に役立つ
35
scheck
• ユースケース
36
function foo($avar) { return $avarr; }
$ scheck test.php demos/scheck.php:4:9: CHECK: use of undefined variable $avarr demos/scheck.php:3:13: CHECK: unused Param variable $avar
codemap
37
codemap
• 色とサイズで雰囲気が分かる • サイズがでかいファイル名ほど行数でかい • 関数名とかタグクラウドっぽくなってる – 呼ばれてる回数が多い関数ほどでかく書いてある
38
codemap
39
Linux 2.6
codemap
40
Android
codemap
• GUIをダブルクリックするとemacsで開けたりする
• ここにめっちゃサンプルある – https://github.com/facebook/pfff/wiki/Examples
41
42
まあ、いま動かないにしても凄そうなのはわかった
43
でもPHPでしか 使えないんでしょ?
44
他言語対応用に 拡張書けるよ
lang_xxx
• OCamlで書けばいいよー
• 字句解析器 – lang_xxx/parsing/lexer_xxx.mll
• 抽象構文木生成器 – lang_xxx/parsing/ast_xxx.ml
• パーサー – lang_xxx/parsing/ast_xxx.ml
45
46
ところで
47
「pfffについて話すよ」 って作者に言ったら
Wikiに紹介された
48
49
こんな発表で ごめんなさい>< でも頑張って!
50
まとめ
まとめ(2011/02/12時点)
• sgrep, scheck, codemapあたりは便利そう
• ただ動かない! • ただただ動かない!
• みんなどんどん使ってバグ報告しよう!
51
追記
• ちょうどPython Hackathon 2011.02の開催日に大量のアップデートがあってMac OS X+MacPortsでもビルドできるようになりました!
52