コードの書きかたやコミットのしかたが大事なのはわかっても,
そういうときは,
でも,
そうだなあ,
すべてのコードを読む
最も単純なのは,
この方法では,git clone
したり,
この読みかたは,chmod
コマンド相当のことを可能にするchmodというnpmライブラリのGitHub上のリポジトリを参照すると,index.
という名前のJavaScriptのファイルが1つだけ置かれています。ファイルブラウザで内容を確認すると,
しかしその裏返しとして,
興味のある個所だけを読む
もう1つの読みかたは,
ある程度以上の規模のソフトウェアになると,
「興味のある個所」
典型的なファイル配置を手がかりにする
ソフトウェアの種類によっては,lib
以下に,bin
以下に,test
以下に,bin
内を見てみる,
たとえばRuby製のプレゼンツールRabbitはスライドのひな型を自動生成するrabbit-slide
というコマンドラインツールを提供していますが,bin/
の位置にあるファイルであることがわかります。そこでbin/
の内容を見てみると,
リスト1 見つかったrabbit-slideコマンドの実装の内容
#!/usr/bin/env ruby
(中略)
require "rabbit/command/rabbit-slide"
exit(Rabbit::Command::RabbitSlide.run(*ARGV))
ライブラリのパスがrabbit/
と指定されていますが,rabbit/
は,lib/
がその実体です。
このように,
- 注1)
- 引用個所のソースコードはhttps://
github. から入手できます。com/ rabbitshocker/ rabbit
ソースコード内をキーワードで検索する
読みたい実装のありかがまったくわからない場合は,clone
したりしたうえで探索します。
たとえば,convert()
というメソッドは,function convert() {}
やconvert = function() {}
のようなJavaScriptのコードで定義されているだろうと推測できますので,function convert\(|convert = function
といった正規表現でメソッドの定義個所を探せます。grep
またはgit grep
-E
オプションで正規表現での検索ができますし,-n
オプションを加えれば見つかった個所の行番号も出力できますので,
図3 git grepでソースコードを検索する
$ git grep -n -E "function convert\(|convert = function" lib/ lib/encoding.js:26:function convert(str, to, from, useLite) {
lib/
の位置にあるファイルの26行目だけがマッチしていますので,UTF-8
と決め打ちされている様子などが読み取れます。また,grep
しなおす……という手順を繰り返すことで,
リスト2 見つかったencodingのconvertメソッドの実装個所
/**
* Convert encoding of an UTF-8 string or a buffer
*
* @param {String|Buffer} str String to be converted
* @param {String} to Encoding to be converted to
* @param {String} [from='UTF-8'] Encoding to be converted from
* @param {Boolean} useLite If set to ture, force to use iconvLite
* @return {Buffer} Encoded string
*/
function convert(str, to, from, useLite) {
from = checkEncoding(from || 'UTF-8');
to = checkEncoding(to || 'UTF-8');
str = str || '';
メソッドの名前以外に,
Firefoxのように国際化が考慮されているソフトウェアでは,readConfigMsg
という内部的な識別子が割り当てられていることが見て取れます。そこで,
見つかった2ヵ所のうち2つ目は先ほど見たメッセージの定義個所で,
- 注2)
- GitHub などでリポジトリを公開しているプロジェクトでは,
最新のソースコードをWeb上で閲覧できる場合が多いです。 - 注3)
- 通常の
grep
コマンドだとキャッシュなどのファイルまで検索対象になってしまいますが,git grep
ではリポジトリでバージョン管理されているファイルだけが検索対象になります。 - 注4)
- 引用個所のソースコードはhttps://
github. から入手できます。com/ andris9/ encoding - 注5)
- 日本語版では
「設定ファイルを正常に読み込めませんでした。システム管理者に問い合わせてください。」 - 注6)
- Firefoxのソースコードの場合,
Mozillaが提供しているオンラインのソースコード検索システムMXRを使うと楽です。
発生している障害を手がかりにする
あるソフトウェアを利用していて障害が発生した場合,
未知の例外が発生してソフトウェアの動作が止まってしまったときに,
図6は,raise
されたのは1行目の個所で,
図6 スタックトレースの例
vendor/bundle/ruby/2.2.0/gems/glib2-2.2.4/lib/glib2/deprecatable.rb:85:in `signal_connect': no such signal: expose-event (GLib::NoSignalError) from vendor/bundle/ruby/2.2.0/gems/glib2-2.2.4/lib/glib2/deprecatable.rb:85:in `block (3 levels) in extended' from lib/rabbit/renderer/display/drawing-area-primitive.rb:139:in `set_expose_event' from lib/rabbit/renderer/display/drawing-area-primitive.rb:119:in `init_drawing_area' (中略) from lib/rabbit/command/rabbit.rb:51:in `run' from lib/rabbit/command/rabbit.rb:29:in `run' from bin/rabbit:22:in `<main>'
各行のファイルパスを見ると,bundler
で導入された依存ライブラリのパスであることが見て取れます。Rabbit固有のファイルのパスは3行目以降に現れていますので,
- 注7)
- バックトレースとも言います。