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に回答がある

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

QNapにgitbucketをインストール

ググるとちょこちょこ試している人がいるようなので割と簡単にインストールできるみたい。実際に試してみた。

  1. AppCenterからJRE_ARM ver8.6.0、Tomcat ver7.0.50、git ver1.8.4.2-1をインストール
  2. Tomcatのページを開いて、gitbucketのwarファイルをデプロイ
    gitbucketの最新版はこちら

という手順で簡単インストールの予定だったが、いくつかハマってしまった。

ハマったところ

Tomcatを起動したら白い画面

インストールできたものの起動したら白い画面であの可愛くない猫が表示されなかった。
よく原因がわかってないが、TomcatのサービスをAppCenterから一度無効にして再度有効化したら治った。

ファイルサイズ制限に引っかかった

gitbucketをデプロイしようとしたところデプロイできるファイルサイズ制限に引っかかったのでsshnasに入って

/share/MD0_DATA/.qpkg/Tomcat/tomcat/webapps/manager/WEB-INF/web.xml
vimで以下のように編集してtomcatを再起動してやり直しました。

    <multipart-config>
      <!-- 60MB max -->
      <max-file-size>62914560</max-file-size>
      <max-request-size>62914560</max-request-size>
      <file-size-threshold>0</file-size-threshold>
    </multipart-config>

なんか起動しなくなった

gitbucketの設定ファイル は
/share/MD0_DATA/homes/admin/.gitbucket/gitbucket.conf
にあったのでインストールをやり直すときはこれをフォルダごと消してやり直してどうにかなった。

pogoplugにdebianインストールできました

手元に結局使わず転がっていたPogoplug Mobileを有効利用すべくDebianをインストールしました。2014/11/22時点では簡単にインストールができました

http://blog.qnology.com/2014/07/hacking-pogoplug-v4-series-4-and-mobile.html

の手順の通りに上から順にコマンドを打っていくだけです。
DebianをSDカードインストールすることを前提にしているのでUSBメモリからOSを起動したい場合はところどころコメントでUSBメモリの場合はこちらみたいに書かれているので確認しながらコマンドを打つと良いです。

root@debian:~# cat /etc/debian_version
7.4

 のようにDebian 7.4がインストールできました。eyefiのサーバーとか音楽サーバーに出来ないか色々試していきたいです。

hubotのインストールからアダプタ、スクリプトの自作まで

※2014/11/15 スクリプトの書き方加筆

オレオレシステムに投稿するためのボット作成にhubotを使ってみました。
公式ページの最新ぽいやり方でインストールを進めてみてハマったところをメモ。

インストール


hubot/README.md at master · github/hubot · GitHub

より

% npm install -g yo generator-hubot

 でyeomanというテンプレートからプロジェクト生成を行うツールとhubot用のテンプレートをインストール。

% mkdir myhubot
% cd myhubot
% yo hubot

適当にフォルダを作ってyoコマンドを使ってプロジェクト作成のウィザードを起動します。色々聞かれますが練習なら何も入力しなくていいはずです。
以下では全てmyhubotフォルダをカレントディレクトリに設定している前提です。

※既にhubotをインストールしていたらyo hubotのところでコケました

アダプタを作る

オレオレシステムに投稿するためのアダプタを作ります。投稿やタイムラインの受信を実装すればオレオレシステムにボットが動かせます。

node_modules/adapters/にアダプタのソースをおけばいいので

% cp node_modules/hubot/src/adapter.coffee node_modules/hubot/src/adapters/myadapter.coffee

を実行してテンプレートをコピー。
node_modules/hubot/src/robot.coffeeの

HUBOT_DEFAULT_ADAPTERS = [
  'campfire'
  'shell'
  'myadapter'
]
辺りを自作したアダプタ名を追加して保存する。

アダプタの実装方法はサンプルを見るかググった方が詳しいページが出てくるので割愛します。

% bin/hubot -a myadapter

で動作確認します。エラーが出なければ成功。

スクリプトを作る

スクリプトは実際のボットの動作を記述するもので、前述のアダプタのおかげで特定のシステム依存のコードを書く必要がないので使い回しが楽チン。
スクリプトにもテンプレートがあるのでそれを使えばOK。スクリプトはscriptsフォルダに配置したものが全て読み込まれるようです。
scripts/example.coffeeをコピーしてオレオレスクリプトを書き始めると良いでしょう。

割と公式の情報も充実しているので慣れてきたら読んでみようと思います。

hubot/adapters.md at master · github/hubot · GitHub

hubot/scripting.md at master · github/hubot · GitHub

 

実際に書き始めてみたら、self.emit 'connected'を実行しないとスクリプトの読み込みが進まなかったのでしばらくハマりました。
何かハマったら

export HUBOT_LOG_LEVEL="debug"

してから実行するとデバッグログが出るようになるので何かヒント見つかるかもしれません

絵を普段描かないから気づかなかったけど、絵描きも結構体系化されている知識があるんじゃないかと

前に熱中教室というイベントに行ってきて思ったんですが*1

車のデザイン画などは、右上がりになっている構図が多い印象があるのはデザイナーがみんな右利きなんじゃないかと。。。

熱中教室の山中先生の授業でデッサンするときに骨を意識して描きましょうというお話だったんですが、初級編として円を描く練習をやりました。
何周もクルクル描いてきれいな円になったらペンを抜きましょうという練習をしました。

正円はいいとして、斜めになっている円を描こうとしたら、どうも見本と同じように描けなくて苦労しました。
左上がりの円の方が描きやすく、右上がりの円が描きづらかったです。なので利き手によって描きやすさが異なるんだなと気づきました。
(似たような話をしている人もいますね http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1386268378

そうつまり、骨(構造)の問題だ!

絵を描くに当たって描きやすいものと、描きにくいものがあるって発見をしたわけです。
こんなことを知り合いに話していたら、熱中教室で教えてもらったような”骨を意識して描こう”とか描くときのハウツーを学校とかで教えてもらえるらしいことがわかりました。
絵を描くのは見稽古しかない世界かと勘違いしてましたが、実は高速道路*2あるじゃん!と感激したわけです。
実は知らないだけで、絵描き界のRuby on Railsみたいなものが実はあったりするんじゃないかと。。。
そういうものがもっと溢れて世界総アマチュア時代にやっぱり突入するんだろうし、それを加速させたいなと思いました。

 

全然ジャンルの違う勉強会やイベントに行っても色々発見があって面白いですね。
それにしても山中先生=骨展*3のイメージだったので、デッサンで骨の話をしだしたときは納得でしたw

おまけ 円の書き方など


動画で解説! 指だけでキレイな円を描く方法 | ライフハッカー[日本版]

このハックは練習しておいてもいいかも。


World Freehand Circle Drawing Champion - YouTube

すげーきれいに一発で書いてて面白いです。体をちゃんと使ってるのがポイントかと。

*1:3331熱中教室 8/9,8/10 | Peatix

*2:将棋羽生さんの学習の高速道路論

*3:21_21 DESIGN SIGHT

AndroidStudio0.4がご機嫌斜めです

Android Studioを更新するたびにトラブルになってるような気がする。

しばらくバージョンを上げていなくて、0.3系から0.4.2にアップデートしたところビルドが失敗するようになってしまった。

1つ目

公式にあるように、build.gradleに書いてあるgradleプラグインのバージョンを上げる対応が必要だった。

Change those to "0.7.0" (or 0.7.+ to pick up the latest dot release) :

http://tools.android.com/recent/androidstudio040released

2つ目

ビルド時に以下のようなエラーが出るようになってしまった。

: duplicate files during packaging of APK /XXX/myapp/build/apk/myapp-debug-unaligned.apk
Execution failed for task ':myapp:packageDebug'.
> Duplicate files copied in APK META-INF/DEPENDENCIES
File 1: /XXX/myapp/libs/httpmime-4.3.1.jar
File 2: /XXX/myapp/libs/httpmime-4.3.1.jar

使っているライブラリによってエラー内容は変わるが、何かプラグインのバグの模様。
ここに上がっているIssueにある解決方法のように

android {
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
    }
}

というように問題になっているファイルをどんどん除外していけばビルドが通るようになるようだ。

android {
    中略

    packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/NOTICE'
    }
}

こんな感じにbuild.gradleに書いてどうにかビルドできた。


メモリダンプ(HPROFファイル)がAndroid Studioから取れるようになったらしいのでバージョンアップしたかっただけなのにかなりハマってしまった。

iOS側でカメラを使って撮った動画をAndroidで再生したいのですが

作ってるアプリで欲しかった機能についてかなりハマりながらもやっとどうにかなったのでメモ。
iOSで撮った動画をAndroidでもどうこうしたいってのがニーズが少ないんだろう…全然ぐぐっても出てこなかった。

環境

iOS:iPhone4
Android:Galaxy S2(Android 4.0.3)

結論

  • movはAndroidで再生しづらいのでmp4が無難

細かいところはちょろちょろ書きます

iOS

標準カメラだとmovで保存されてしまうので自前でカメラアプリを実装する必要がある。
よく見たら

という定数があってmp4で書き出すことが標準ライブラリで出来ました


カメラを自分でちゃんと実装するのは大変そうだったのでPBJVisionというライブラリを使っている。
PBJVisionは投稿時点では、kUTTypeQuickTimeMovieを指定して書き出されていたのでうまくAndroid側で再生できていなかった。
kUTTypeQuickTimeMovie -> kUTTypeMPEG4に書き換えて使った

Android

Androidが標準でサポートしているフォーマットは以下の通り。当然QuickTime形式はありません。
http://developer.android.com/guide/appendix/media-formats.html

ファイルフォーマットがmp4になってしまえばあとはAndroid標準のMediaPlayerクラスを使って再生する実装を行うだけ
この辺りを参考にしつつ実装を進めました。

MediaPlayerにサポート外のファイルを渡した場合にIOExceptionが発生した

具体的に書くと、PBJVisionをそのまま使っていたのでkUTTypeQuickTimeMovieで書き出した、.mp4ファイルを再生しようとして
MediaPlayer.setDataSourceを呼んだときに

java.io.IOException: setDataSourceFD failed.: status=0x80000000

という例外が発生していた。kUTTypeMPEG4を指定して書き出した場合にはうまく再生出来たのでAndroidで再生出来ない形式になってしまっていたというふうに考えている。これ以上詳細は調べられていないので何か知っている人がいたら教えて欲しいところ。

まとめ

カメラアプリでiOS-Android連携って聞かないからハマってもしょうがないのかも。

無事、iOSで撮った動画がAndroidで再生できました。