<p>開発チームの海老原です。<br />
みなさん今日も元気にソースコード追ってますか? ということで今回は技術ネタです。</p>
<p>普段どおり楽しくコードを追ってたら、手嶋荘住人の川原君に、<br />
「探索スキル高いですねー」<br />
と感心されてしまったので、僕がコードを追うのに使っている方法を紹介していきます。</p>
<h3>■本日のテーマ</h3>
<p><strong>「foo() という関数がどこで使われているか見たい!」</strong><br />
といったときのソースコードの追い方をご紹介します。</p>
<h3>■前提環境</h3>
<p>僕が開発に使用している以下の OS を想定して解説します。<br />
といってもまあ UNIX 系 OS ならほとんどそのまま参考になるでしょう。<br />
・Debian sid<br />
・Mac OS X Leopard</p>
<h3>■ go “ack” !</h3>
<p>さて、本日のテーマ、<br />
「foo() という関数がどこで使われているか見たい!」<br />
というとき、こんなコマンドを叩いている方はいませんか?</p>
<blockquote><p><code>$ grep -rw "foo(" .</code></p></blockquote>
<p></p>
<p>これでも目的は果たせます。しかし、<br />
・結果が見づらい<br />
・subversion などのバージョン管理システムが使うディレクトリも対象にしてしまう(パイプで繋ぐことで回避は可能)<br />
などといった欠点があります。</p>
<p>これを一気に解決してくれるだけでなく、ソースコード検索において<br />
強力な機能を提供してくれるツールが ack です。<br />
<a href="http://search.cpan.org/dist/ack">http://search.cpan.org/dist/ack</a></p>
<p>ack は CPAN で提供されているので、インストールは CPAN シェルに入って……<br />
と言いたいところですが、 Debian では apt でインストールすることができます。<br />
やっぱり Debian はいいですね。</p>
<blockquote><p><code># apt-get install ack-grep</code></p></blockquote>
<p>その他の OS では、普通に CPAN でインストールするか、パッケージを取ってきて<br />
展開して設置という手段を採る必要があります。 まあ CPAN でインストールするのが妥当でしょう。<br />
以下のコマンドで CPAN シェルに入ってください。</p>
<blockquote><p><code># cpan</code></p></blockquote>
<p>CPAN を使うのがはじめてであればここで設定に必要な事項の入力が求められます。<br />
CPAN の設定についてはここでは解説しませんので、「CPAN 設定」などで検索してみてください。</p>
<p>準備が整ったら、 CPAN シェル上で以下のコマンドをタイプしてください。</p>
<blockquote><p><code>cpan> install App::Ack</code></p></blockquote>
<p>あとは指示に従えばインストールが完了するはずです。シェルから抜けてください。</p>
<blockquote><p><code>cpan> exit</code></p></blockquote>
<p>これで晴れて ack を利用できるようになりました!</p>
<p>それでは以下のコマンドを叩いて grep との差を見せつけてやりましょう。</p>
<blockquote><p>(Debian の場合)<br />
<code>$ ack-grep -w "foo("</code></p>
<p>(それ以外)<br />
<code>$ ack -w "foo("</code></p></blockquote>
<p></p>
<p>すごく見やすい! しかも .svn ディレクトリもご丁寧に無視してくれている!<br />
これはもう使い倒していくしかないですね。</p>
<p>ということで、簡単に ack の便利な使い方を紹介していきます。</p>
<h3>■ ack を使いこなす</h3>
<h4>前後の行を表示する</h4>
<p>先ほどの例だと、「どこで」関数が使われているかはわかりますが、<br />
「どうやって」「なぜ」関数が使われているかが伺い知れなかったりします。<br />
そんなときにはこれ。</p>
<blockquote><p>(Debian の場合)<br />
<code>$ ack-grep -C10 -w "foo("</code></p>
<p>(それ以外)<br />
<code>$ ack -C10 -w "foo("</code></p></blockquote>
<p>この -C10 で、ヒットした行と前後をあわせての 10 行分の結果を出力してくれます。</p>
<p></p>
<p>前しか必要ないなら -B10、後ろだけなら -A10 と指定することもできます。</p>
<p></p>
<h4>検索パターンに正規表現を使う</h4>
<p>正規表現は grep でも使えるんですが、 ack では Perl 準拠の正規表現で書けるところがミソです。</p>
<p>lib ディレクトリ以下で、 op というプレフィックスがついたクラスなどの定義を見たい場合、<br />
こんな感じでコマンドを実行してみてはどうでしょうか。</p>
<blockquote><p>(Debian の場合)<br />
<code>$ ack-grep "(class|interface)s+opS+" lib</code></p>
<p>(それ以外)<br />
<code>$ ack "(class|interface)s+opS+" lib</code></p></blockquote>
<h4></h4>
<h4>「条件にマッチする」ファイルの一覧を表示</h4>
<p>ack ではヒットしたファイル名のみを出力することができます。<br />
lib ディレクトリ以下で OpenPNE のライセンス表記が含まれるファイルをリストアップします。</p>
<blockquote><p>(Debian の場合)<br />
<code>$ ack-grep -l " * This file is part of the OpenPNE package" lib</code></p>
<p>(それ以外)<br />
<code>$ ack -l " * This file is part of the OpenPNE package" lib</code></p></blockquote>
<p><a href="https://www.tejimaya.com/wp-content/uploads/e38394e382afe38381e383a3-90.png"></a></p>
<p>これと xargs コマンドを併用することで、他のコマンドとの連携が可能になるなど応用できます。<br />
(以下の例では条件にマッチしたファイルを削除します)</p>
<blockquote><p><code><br />
$ ack-grep -l "cholesterol" | xargs rm -f<br />
</code></p></blockquote>
<h4>「条件にマッチしない」ファイルの一覧を表示</h4>
<p>逆もできます。<br />
今度はライセンス表記が含まれないファイルをリストアップします。</p>
<blockquote><p>(Debian の場合)<br />
<code>$ ack-grep -L " * This file is part of the OpenPNE package" lib</code></p>
<p>(それ以外)<br />
<code>$ ack -L " * This file is part of the OpenPNE package" lib</code></p></blockquote>
<p>もちろんこれも他のコマンドと組み合わせやすくて重宝します。</p>
<blockquote><p><code><br />
$ ack-grep -L "Kousuke Ebihara " | xargs rm -f<br />
</code></p></blockquote>
<h3>■他にも便利な使い方がたくさん</h3>
<p>ack には紹介しきれないくらい多くの便利なオプション(-f や –thpppt など)が存在します。<br />
また、設定ファイル .ackrc によって検索対象のルールを作成することもできます。</p>
<p>ぜひ、 <a href="http://search.cpan.org/dist/ack/ack-base">http://search.cpan.org/dist/ack/ack-base</a> のマニュアルをご覧ください。<br />
きっと新しい活用方法が見つかるはず!</p>
<p>コードリーディングを楽しむには、 ack のような便利なツールが不可欠です。<br />
ぜひみなさんも今回紹介したテクニックを活用して、コードと友達になりましょう!<br />
それでは、よいコードリーディングライフを!</p>