読者です 読者をやめる 読者になる 読者になる

Life, Education, Death

プログラミング以外でも思ったことをつらつらと書きたい

普段どうやってエラーメッセージから問題を解決しているか?

そもそも

慣れれば簡単にぐぐれるだろ!って思いがちなんだけど、普段どうしているかちゃんと振り返っておかないと、人に伝えられないので振り返ってみます。

エラーに遭遇する

エラーは突然やってくる。ちょっと今流行りのモジュールを動かそうと思ってwikiやブログ記事の通りにコマンドを打ったのにも関わらずハマってしまうことがよくある。

今回は、bundle installをして必要なライブラリをセットアップしようと思ったらハマってしまったあんまりプログラミングが詳しくない人を想定しています。

bundle install

Fetching gem metadata from http://rubygems.org/...........
Fetching version metadata from http://rubygems.org/...
Fetching dependency metadata from http://rubygems.org/..
Resolving dependencies....
Installing rake 10.4.2
Installing addressable 2.3.8
Installing io-like 0.3.0
Installing archive-zip 0.7.0
Installing backports 3.6.4
Using bundler 1.10.3
Installing coderay 1.1.0
Installing daemons 1.2.2
with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /Users/hogehoge/.rvm/rubies/ruby-2.0.0-p0/bin/ruby -r ./siteconf20150607-53401-6yipdt.rb extconf.rb
checking for rb_trap_immediate in ruby.h,rubysig.h... no
checking for rb_thread_blocking_region()... yes
checking for ruby/thread.h... yes
checking for rb_thread_call_without_gvl() in ruby/thread.h... yes
checking for inotify_init() in sys/inotify.h... no
checking for __NR_inotify_init in sys/syscall.h... no
checking for writev() in sys/uio.h... yes
checking for rb_thread_fd_select()... yes
checking for rb_fdset_t in ruby/intern.h... yes
checking for rb_wait_for_single_fd()... yes
checking for rb_enable_interrupt()... no
checking for rb_time_new()... yes
checking for sys/event.h... yes
checking for sys/queue.h... yes
checking for clock_gettime()... no
checking for gethrtime()... no
creating Makefile

make "DESTDIR=" clean

make "DESTDIR="
compiling binder.cpp
make: g++-4.2: No such file or directory
make: *** [binder.o] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/hogehoge/.rvm/gems/ruby-2.0.0-p0/gems/eventmachine-1.0.7 for inspection.
Results logged to /Users/hogehoge/.rvm/gems/ruby-2.0.0-p0/extensions/x86_64-darwin-11/2.0.0/eventmachine-1.0.7/gem_make.out
An error occurred while installing eventmachine (1.0.7), and Bundler cannot
continue.
Make sure that `gem install eventmachine -v '1.0.7'` succeeds before bundling.

時間が無駄にかかるぅって気分になるんですが、冷静になって対処します。

まずはErrorって文字がある行を探します。

ターミナルの設定によっては赤く強調されているかもしれませんね。

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
make: *** [binder.o] Error 1
An error occurred while installing eventmachine (1.0.7), and Bundler cannot
continue.

の3箇所が見つかります。とりあえず

  • gem native extensionってのがビルドエラーになった
  • よくわからないけど、なんかエラーが起きた
  • eventmachine (1.0.7)がインストールできなくてBundlerが中断された ことがわかりました。

ある程度rubyを知っていればスキップできますが、知らない場合は文章に含まれるキーワードっぽいものを探してぐぐります。 今は、rubyをいじっていてBundlerを使ってインストールをしようとしているので、

ruby eventmachine

などとぐぐって、これが何なのか概要を確認しておくと良い場合があります。

一旦、eventmachineというライブラリのインストールに失敗してしまったことがわかりました。 (native extensionとは何なのか不明ですが)

キーワードを適当に並べてぐぐってみて、同じエラーが出て困っていた人がいないか調べます。 今回はこんなキーワードにしました。

gem eventmachine native extension error

ぐぐったところ、検索結果1ページ分全部見て同じシチュエーションの記事が見つけられなかったので最初のエラー内容をもう少し見直します。

他の作戦を考える

だいたいエラーメッセージの前後に、原因の詳細が出ていることが多いので周辺を確認します。

make "DESTDIR=" clean

make "DESTDIR="
compiling binder.cpp
make: g++-4.2: No such file or directory
make: *** [binder.o] Error 1

make failed, exit code 2

が気になりました。makeとはなんでしょうか?とりあえずぐぐります。 たぶんMake: Japanではないでしょうw

wikipediaが見つかりました。その他の数ページを軽くみた限りではコマンド名であることがわかります。make - Wikipedia

普段コンパイルするような言語を触っていないとwikipediaに出てくる数々にキーワードが全然ピンと来なくて沼にハマりそうな気がしますが、あまり気にせず無視して進みましょう。

makeがコマンド名ということがわかりました。先ほどのmakeコマンドから出ているであろうメッセージは若干の英語力があれば、短い文章なので理解ができると思います。

make: g++-4.2: No such file or directory

何かファイルかフォルダがないようです。これはエラーの原因の可能性がありそうなメッセージですね。 g++4.2という新しいキーワードがまた出てきましたが、一旦無視してぐぐります。

make g++-4.2: No such file or directory

すると

http://blog.inouetakuya.info/entry/20120716/1342415386

というページを見つけました。インストールに失敗しているライブラリは違いますが同じmakeコマンドからのメッセージが出ているので試してみます。 先ほどのブログを上から読んで

gcc と g++ がインストールされているか確認

うん、確かにg++というのはあるぞ。

gcc 及び g++ へのシンボリックリンクを作成する

適宜シンボリックリンクが何か調べた方がいいですが、最悪とりあえずコピペでやってみるのもアリ。

g++4.2がないと怒られているので、これだけやれば良さそうです。

sudo ln -s /usr/bin/g++ /usr/bin/g++-4.2

改めてbundle installをしてみたところインストールが完了しました。めでたしめでたし

まとめ

この前ハマったのをモデルケースとして出来るだけ知識がないつもりで再度やってみました。

以下の点がポイントかなと個人的には思っています。

  • とりあえずエラーメッセージとそうでないものを仕分ける
  • エラーメッセージ周辺を読む(簡単な英語力で読めるケースが多い)
  • 概要だけを把握して、どういうキーワードでぐぐるべきかの判断力を磨く
  • とりあえずググる。だいたい個人ブログかstack overflowに回答がある

最初のうちは周りに詳しい人がいれば、サクッと聞いてしまうのが良いですね。これはこれで良い聞き方の話がありそうなので気が向いたら整理したいところです。