CMake + Cutter で簡単にテスト&ビルド。
仕事でプログラムを書いているわけですが、Makefileはベタ書き、テストはまともに書いていませんでした。
で、最近から書き始めたコードではさすがにそれはまずいだろう、今後の自分のためにならないだろうと思い、CMakeやCutterについて勉強しはじめました。
CMakeというのはMakefileやVisualStudioのソリューションを作ってくれるソフトウェア。役割としてはautotoolsとほぼ同じ。ただ根本的に違うこと一つあり、autotoolsは主にUnix系OS向けなのに対し、CMakeはクロスプラットフォームでUnix、Windowsなどは問わないのです。
有名なところだと画像処理ライブラリであるOpenCVで利用されています。OpenCVはCMakeの売りであるクロスプラットフォーム対応を最大限活用してUnix、Windows、さらにはiOS、Androidにも対応させています。
ただ、ここではそんな高度なことは全くするつもりなんてありませんし、そもそもできません・・・
ここではクロスプラットフォームなんて単語は無視してMakefileを簡単に生成するためだけに利用します。
次にCutter。これはテスティングフレームワークで同種のもので有名なところだとCUnit、CppUnitなどでしょうか。
Cutterの特色は簡単に書けること。テストプログラムでよくあるよくわからない呪文は無く、よくわからない手順もかなり簡略化されています。
さて、CMakeやCutterをなぜ使おうと思ったかというと、よく使われているツールより簡単そうだったから。ただそれだけ。
(だって今からMakefileの書き方とかautotoolsの使い方、CUnitのよくわからない呪文なんて覚えたくないし、楽できるならソッチのほうがいいじゃないですかー。楽できて同じ事ができるならそれでいいじゃないですかー。)
というわけで自分が忘れないためにもCMakeとCutterの使い方についてまとめていこうかと思います。
ブログを書く手間を省くため、ここではCMakeの書き方とビルド、Cutterの実行だけ説明しようと思います。
Cutterの書き方についてはまた後日、気が向けば。
ではCMakeの書き方について。
参考にさせていただいたのは以下の二つのサイト。
よくわからない現代魔法 cmakeの使い方メモ
CMakeを使って自作ライブラリをビルド&インストールしてみたまとめ - へぼいいいわけ
利用したプログラムのソースはCutterのチュートリアルから拝借。
cutterのソースプログラムのsample/stack以下のファイルを利用し、autotools用のファイルを無くしてCMakeのファイルに置き換えています。
CMakeを使うにはCMakeLists.txtというファイルを作ります。
ディレクトリ・ファイル構成は以下とします。
cmake_cutter |-- CMakeLists.txt |-- src | |-- CMakeLists.txt | |-- stack.c | `-- stack.h `-- test |-- CMakeLists.txt `-- test-stack.c
トップディレクトリであるcmake_cutterにあるCMakeLists.txtは以下のように書きます。
# これはコメント cmake_minimum_required(VERSION 2.6) # このCMakeLists.txtを実行するのに必要なバージョンの下限 subdirs("${PROJECT_SOURCE_DIR}/src" "${PROJECT_SOURCE_DIR}/test") # 指定したディレクトリ以下のCMakeLists.txtを実行する。 # ちなみに PROJECT_SOURCE_DIR はCMake側で定義済みの変数。ここではcmake_cutterになる。
中身は最低限の記述だけ。
重要なのは実行に必要なバージョンの下限と、サブディレクトリの指定。説明はプログラムを参照。
次にsrc以下にあるCMakeLists.txt。
add_library(stack SHARED stack.c) # ビルドするライブラリの設定。 # 第一引数はライブラリ名、第二引数はビルドするライブラリのタイプ。第三引数はライブラリに含めるプログラムのソースファイル名。
これだけ。やっているのはライブラリのビルド設定のみ。
最後にtest以下のCMakeLists.txt。
include_directories(${PROJECT_SOURCE_DIR}/src /usr/include/cutter) # インクルードファイルのあるディレクトリ。 # stackプログラムのあるsrcとcutterのインクルードディレクトリがある/usr/include/cutterを指定している。 link_directories(${PROJECT_BINARY_DIR}/src) # リンクに必要なファイルのあるディレクトリの設定。 # PROJECT_BINARY_DIR はビルド時に利用するディレクトリ。あとで作成するbuildディレクトリがそれになる。 add_library(test_stack SHARED test-stack.c) # ライブラリのビルド設定。 # cutterはテストの実行にシェアードライブラリを利用する。 target_link_libraries(test_stack stack) # リンク設定 # test-stack.c で利用しているstackプログラムをリンクするように設定している。 # リンクする対象であるtest_stackが定義されてからtarget_link_librariesを実行する必要があるので、add_libraryの後に書かれている。前に書くとエラーになる。
こちらでは少し細かな設定をしている。
srcディレクトリではコンパイルのみで標準のライブラリ以外使っていなかったので、add_libraryによるライブラリのビルド設定だけでしたが、testではビルドされたstackライブラリのインクルードとリンクの設定、cutterライブラリのインクルードの設定が必要です。なのでinclude_directoriesとlink_directoriesを使ってディレクトリを指定しています。
また、リンクについてはリンクするライブラリも指定する必要があるので、target_link_librariesでライブラリを指定しています。
これでCMakeの設定は完了。
Cutterのチュートリアルを読むと分かるのですが、autotoolsの設定は異様に長くて意味不明、Makefileの記法まで覚えなければならないので大変です。
それに比べてCMakeは上記のようにCMakeLists.txtを書くだけなのですごく簡単です。
それではCMakeを実行しましょう。
CMakeを実行するにはcmake_cutterへのパスを指定する必要があります。
$ cmake <cmake_cutterへのパス>
これはソースファイル群を含んだディレクトリとビルドファイルを分離できるようにして、メンテナンスなどをしやすくしているものと思われます。
なので、ビルドに利用するディレクトリを作成してCMakeします。
cmake_cutter |-- CMakeLists.txt |-- build #<=これを作成 |-- src | |-- CMakeLists.txt | |-- stack.c | `-- stack.h `-- test |-- CMakeLists.txt `-- test-stack.c
buildディレクトリ下に移動し、以下を実行します。
$ cmake .. #親ディレクトリなので相対パスで指定 -- The C compiler identification is GNU -- The CXX compiler identification is GNU -- Check for working C compiler: /usr/bin/gcc -- Check for working C compiler: /usr/bin/gcc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Configuring done -- Generating done -- Build files have been written to: /home/kyokushin/programing/cmake_cutter/build
これでMakefileが作成されました。
あとはmakeコマンドを実行するだけ。
$ make Scanning dependencies of target stack [ 50%] Building C object src/CMakeFiles/stack.dir/stack.c.o Linking C shared library libstack.so [ 50%] Built target stack Scanning dependencies of target test_stack [100%] Building C object test/CMakeFiles/test_stack.dir/test-stack.c.o Linking C shared library libtest_stack.so [100%] Built target test_stack
これでビルド完了。
build/src以下にlibstack.so、build/lib如何にlibtest_stack.soが作成されているはずです。
あとはテストを実行するだけ。
Cutterではテストの実行にcutterコマンドを利用します。
cutterコマンドの引数にはテスト用プログラムのシェアードライブラリが含まれたディレクトリを指定します。
ここではbuild/testになります。
$ cutter test/ ... Finished in 0.006037 seconds (total: 0.001482 seconds) 3 test(s), 15 assertion(s), 0 failure(s), 0 error(s), 0 pending(s), 0 omission(s), 0 notification(s) 100% passed
Cutterのソースファイルに含まれているstackプログラムは完成済みなのですべてのテストに通過するはずです。
これでCMakeの書き方からビルド、Cutterの実行までが終わりました。
ここで言いたいことは、
CMakeってAutotoolsより簡単でしょ?
ってこと。
Autotoolsを使おうとするとまずはMakefileの記法について熟知している必要がありますし、さらにAutotoolsの動作についても知る必要があります。
しかし、CMakeではMakefileを作ってくれるのでMakefileについて知らなくても利用することが出来ます(もちろん知っていることに越したことはないです)。
さらに記述する量も少なくて済むので経済的です。
ただ問題は情報が少ないこと。英語の情報は比較的あるのですが、日本語の情報はまだまだで本格的に使っているところも無いみたいなので、細かな使い方が未だに分かっていない状況です。
GoPro Hero 3 Black Edition - 準備+オプションその他編
前回の続きで GoPro Hero 3 Black Edition。今回は準備編ということで、実際に使うまでの準備と別途購入したオプションその他について載せようかと思います。
まずはカメラを防水ケースから取り出します。
カメラの上にある白い三角形の部分をスライドさせながらレンズのある方を上に上げると蓋が開きます。
こんな感じ。
これが出した状態。すっきりしました。
正面には電源兼モード選択ボタンと液晶、レンズ、ボタンの右に2つのランプがあります。上のランプはWifiの状態を、下のランプは撮影状態などを表すために光ります。
上から。シャッター兼決定ボタン。その左下にあるのは撮影状態を表すランプで正面にあったものと同じです。底面と後ろにも同様のものがあります。色々な使い方があるのでどこからでも撮影状態が確認出来るようにするためなんでしょうね。
右から。上の方にある3つ穴は恐らくマイク、その下の1つ穴はスピーカーでボタン操作時に結構な音で鳴ります。おそらく防水ケースにいれていても聞こえるようにするためでしょう。音量調節は可能です。
その下にあるボタンはWifiボタン。Wi-fi Remoteの設定がしてあると、このボタンを押すことでWifiがonになり、Wi-fi Remoteとつながります。もう一度押すとoffになるかと思いきや、Wifiの設定に移動します。
左にあるくぼみはオプションであるバッテリーパックやLCDパックを取り付けるためにあるみたいです(バッテリーパックとLCDパックは注文済みで1/10に届くのでその時に)。
左から。同じく恐らく3つ穴のマイク。その下に蓋があり・・・
開けるとインターフェースが出てきます。micro HDMI と mini USB、micro SDXC スロット。micro SDXC にはカードが入った状態です。
こんな感じで刺さってます。
裏の蓋を外した状態とバッテリー。バッテリーは本体の半分近くを占めています。
並べてみました。見た感じ1/3の容積を占めてる感じですかね。
次に付属のWi-fi Remote。ボタンと液晶はカメラと全く同じ機能です。
上の写真でWi-fi Remoteの右からでてる金属部分は外すことができます。
外すと下のようになり、写真右に映っている専用充電ケーブルが刺さります。
この写真ではWi-fi Remoteに腕時計用のリストバンドを付けて腕に取り付けられるようにしています。
さて、その他のオプションなど。
まずは正規オプションである三脚用のアタッチメント。
防水ケースに取り付けて利用します。
撮影した動画を保存するためのSDXCカード。SANDISK フラッシュカード SDSDQUA-064G-U46A
今のところ問題なく動作中。
さらに手持ち三脚。ポラロイド の Polaroid ピストルグリップ テーブルトップ ミニ三脚 (小型カメラ, カムコーダー用)
足をたたむとグリップに。
手に持つとこんな感じ。
三脚用アタッチメントと一緒に使うとこんな感じ。
値段の割にしっかりしていていい感じです。
もう一つ自転車のハンドルに取り付けるようにクランプ式の雲台も。
写真は撮ってないのですが、試しに自転車に取り付けてみたら揺れる揺れるでどうしょもなかったです・・・ただ揺れる原因がクランプに直結している回転部分で、ここがバネ式の固定になっていたからでした。ネジを外して軸を少し削って再びネジでがっちり締めなおしたらなんとか使えそうな感じになりました。
と、今回は以上です。
カメラの外観とリモコン、オプションその他の説明でした。
オプションその他は先に挙げたバッテリーパック以外にもいくつか購入したので、次回にでも紹介しようと思っています。
ではでは。
GoPro HERO 3 Black Edition 開封の儀
12月頭に日本でようやく発売されたアクションカメラのニューバージョン、GoPro HERO 3 Black Edition がやっと家に届きました。
発売日当日に新宿ヨドバシカメラに行ってみたのですが予約分で売り切れ、次回入荷分の予約待ち。
ならばとネットショップの方で予約して約1ヶ月ほど待ってようやく届いたのです。
とりあえず開封の儀ということで写真など。
(今になって見てみると色々撮り忘れが・・・)
配達用の箱から出した状態。袋に入っていました。
袋から出して右側面。カメラのスペックが書かれています。
スペック部分を拡大。4K 撮影から240FPS撮影まで出来るとんでも仕様。
ただよくよく見てみると普通に使うのにちょうどいい設定がないんですよね。720pで30FPSとかリーズナブルな感じなのとか。
左側面の説明書き。内容物が書かれています。
Wifiリモコンとアタッチメントがいくつか入っています(最後に内容物一覧の写真を載せています)。
後ろから。
カメラとリモコンの機能説明。
少し詳しいスペック。
説明が書かれていた部分は別の箱になっていました。
カメラが入っている部分のプラスチックはテープで止まっているだけで簡単に外れました。
よくよく考えてみるとこの箱って魅せるために結構お金かけてますよね。
Wi-fi Remote を取り外したところ。針金でギッチギチに縛ってあって外すのに苦労しました。
カメラの取り外し方。箱の蓋がカメラ固定のアタッチメントになっているんです。凝ってますよね。
カメラを取り外したところ。右のペンチはWi-fi Remote を取り外すときに仕方なく。。。
蓋を開けると説明書が。と思いきや、説明書はWebからPDFをダウンロードしろという説明書き。
箱の中にはさらに箱が入っており、アタッチメントなどが雑多に詰まっていました。
内容物一覧。
右上にあるのがカメラで防水カバーに入ったままになっています。
その左にあるのがWi-fi Remote。
さらにその左にあるのがカメラを固定するために使うアタッチメント。
Wi-fi Remote の前にある袋に入った黒いのはアタッチメントをハメる部分。平面用と曲面用が用意されていて、両面テープでヘルメットなどに貼り付ける仕様になっています。
その右にあるのはWi-fi Remote 用のキーリング。
左の方にある2つのケーブルのうち左がWi-fi Remote専用充電ケーブル、右がカメラとパソコンを繋ぐためのUSBケーブル。
中央あたりにある袋に入った四角いのはバッテリー。カメラ本体の容積の約2分の1を占める大きさ。
右の方にある紙っぺらは本当に紙っペラ。Webに説明書ありますよーくらいのことしか書かれていませんでした。
で、最後に一番下の方にあるのがステッカー。3枚入っていました(1枚は早速ノートPCに貼りました)。
と開封時に撮影した写真は以上です。
開けるだけなのに結構手間取りました・・・主にWi-fi Remoteの性で。
にしても海外製品のパッケージっておもしろいですね。パッケージ自体のデザインにも凝っていてかっこいい。製品の魅力をよく引き出しています。
カメラを有効活用するために正規オプションその他色々購入しているのですが、明日が仕事始めなので今日はここまで。
Logitech Wifi DVD 「LDR-PS8WU2BKW」
以前はアメーバブログで買ったガジェットの記事をちょくちょく書いていましたが、はてなに移ってから書くこと忘れていたのですが、久々にキワモノなガジェットを買ったので書こうかと思います。
買ったのはLogitechより発売された Wifi DVD 「LDR-PS8WU2BKW」。
iPhone や Android からWifi経由でDVDが見れるようになるあるようでなかった一品。
商品紹介ページにあるように、「日本初」とあるので海外では同じような製品が出ていたのでしょうね。
この商品を知る切っ掛けになったのはこちらの記事。
最初は要らないかなーと思っていたのですが、
「お風呂でDVDが見れたらいいなー」
と思って買ってみました。
ちなみにこの商品はLogitechの直販専用商品。
電気屋さんでは売っていません。
まずは写真。
といっても3枚だけ。
正面より
大きさはブルーレイディスクのケースより少し大きいくらい。厚みは2枚分くらい。
DVDの出し入れのためのボタンがあるだけで凄くシンプル。
後ろより。
見にくいのですが、左から External、RESET、PC/AV、POWERとなっています。
ExternalはスマートフォンとのWifi接続時にここにUSBメモリなどを指すことで使えるそうです。
Resetは設定の初期化。
この商品、普通の外付けドライブとしても使えるのですが、その時に利用するのがPC/AV。
Powerには付属のACアダプタをつなげます。
よくよく見てみたら、WANなんてのが隠されてました。LANポートです。
なんだこれは。未検証です。
使い方なんですが、この商品が単体でWifiルータとなるので、こいつにスマートフォンがWifi接続することで専用アプリからDVDが視聴できます。
Androidの専用アプリはこちら
で、このアプリはLogitech製ではなくて別のところで作られているみたいで、名前を変えただけで見た目が一緒なアプリが存在します。
これ
サムスン向けみたいですが、問題なく動作しました。
むしろこっちのほうが機能的に上みたいで、操作性が上がっています。
この商品の欠点なんですが、これにWifi接続中はインターネットにつなげません。
まぁ、DVD見てるときはインターネットを見ることはないのでいいのですが、見るために毎回接続しなおさないといけないのが面倒なんですよね。
実際の使い勝手なのですが、さすがにDVDプレイヤーにはかないません。
わざわざWifi繋ぎ直さなきゃいけませんし、ある程度ネットワークとかわかってないと使いこなせない気がします。
そう考えると直販なのはしかたないですね。
見る分には問題なく見れます。
ただ、インターレース方式のDVDには対応していないみたいです。ギザギザがでちゃいました。
見るときにWifi DVDからの画質を3段階で設定出来ます。
が、それが何を意味しているのかわかりません。(調べれば出てくるんでしょうが、今のところ問題ないので放置してます。)
ちなみにサムスン版のAndroidアプリでは、画質を通信速度に合わせて自動で合わせてくれる機能が付いてるみたいです。正常に機能したりしなかったりしますが。
頑張って書いているつもりなのですが、なかなかまとまらないですね。
この手の商品にしては頑張って作られている気はしますが、キワモノですね。機械が苦手な人にはオススメ出来ません。
否定的な内容ばかりになってしまいましたが、それは比較対象が既存のDVDプレイヤーしかないからだと思います。操作性や使い勝手は敵う訳ないので、どうしても否定的になってしまいます。
ですが、DVDがどこでも見れるというのはいいですね。
お風呂の中でもみれるので、長風呂にはもってこい。
個人的には満足。もちろん改良してほしい点は多々ありますが、使い方を考えれば悪くないものだと思います。
ということで、Logitech Wifi DVD 「LDR-PS8WU2BKW」でした。
追記:
シールによって覆い隠されていたLANポートを使ってみました。
なんと隠されていただけでちゃんと機能しました。これだけでも驚き。
ちなみに有線LAN接続するとWifiは無効になりました。
さらに!これを持っているルータにつないで、アプリ側でIPアドレスを直接指定したらちゃんと認識してくれました!これは嬉しい!
ルータの切り替えをする必要がなくなったので凄く使い勝手がよくなりました!やったね!
でもこの機能って本来なら手動での設定なしで使いたい機能なので、総評はかわりませんねー。
やっぱり機械が得意な人じゃないと使いこなすのは無理そうです。
GrowCut - 画像処理のおはなし
8カ月ぶりの更新。
ちょっとやるきが出たので画像処理のおはなしです。
試してみたのはGrowCutという画像のセグメンテーション手法の一つ。
画像のセグメンテーションというとGrabCutが有名ですね。OpenCVにも実装されてるし。
じゃぁ何でGrowCutなんて試したのか。
それはとても簡単だから。
実装するだけなら本当に超簡単(自分にも出来たくらい)。
また実装例は以下にあります。
(注意:この実装例にはバグがあって、ところどころおかしいです。L2ノルムの計算は平方根必要ないのにsqrtで平方根をだしてしまっています。)
あと宣伝になりますが、GitHubにプログラムをあげました。
プログラムは先に紹介した二つ目のURLを参考にし、理論部分は一つ目のURL(論文)で補強してプログラムのバグを回収しています。
kyokushin/GrowCut-gui · GitHub
GitHubにあげたプログラムはWindows上で開発しています。
ですが、Windowsに依存した実装はしたつもりはないのでLinuxなど他のOS上でも動くと思います。
利用しているライブラリはOpenCVのみ。
使い方は二通り。
一つはコマンドライン引数なしで実行。
するとGUIが立ち上がり、ソースコードと一緒に入っているネコの画像が表示されます。
ネコの部分を左クリックで大雑把にぬり、背景を右クリックで大雑把にぬります。
できたらキーボードの'g'を押すとGrowCutが開始されます。
GrowCutが始まると、セグメンテーションの進捗と各セルの強さ(論文参照)を表示するウィンドウが新たに2つ現れ、残りはひたすらまつだけです。
処理が完了すると、セグメンテーションの結果を利用してネコの部分を切り抜いた画像が表示されます。
表示されたウィンドウでキーを何か押すとプログラムは終了します。
二つ目の使い方は、コマンドライン引数に2つの画像を与えて実行します。
第一引数には、カラー画像を与えます。
第二引数には、前景(ネコの画像だったらネコ)を赤色でぬり、背景(ネコの画像ならネコ以外)を青色でぬり、さらにそれ以外は黒の画像になっている画像を与えます。
実行すると読み込んだ画像が正しいか確認の表示がでます。
間違っていなければキーボードの'n'以外を押してください。
あとはひたすらまつだけです。
これも処理が完了するとセグメンテーションの結果を利用してネコの部分を切り抜いた画像が表示されます。
以上でプログラムの使い方は終わりです。
プログラムのアルゴリズム部分だけ上げておきます。
converged = 0; for( int i=0; i<label.rows; i++ ){ unsigned char* cline = (unsigned char*)src_image.ptr(i); for( int h=0; h<label.cols; h++ ){ unsigned char* cpix = cline + 3 * h; for( int neigh_y=-1; neigh_y<=1; neigh_y++ ){ if( i+neigh_y < 0 || label.rows <= i+neigh_y) continue; unsigned char* nline = (unsigned char*)src_image.ptr(i+neigh_y); for( int neigh_x=-1; neigh_x<=1; neigh_x++ ){ if( neigh_x == 0 && neigh_y == 0 || h+neigh_x < 0 || label.cols <= h+neigh_x) continue; //パラメータの計算 unsigned char* npix = nline + 3 * (h+neigh_x); double b = (double)npix[0] - cpix[0]; double g = (double)npix[1] - cpix[1]; double r = (double)npix[2] - cpix[2]; double C = b*b + g*g + r*r; double G = 1 - C / (3 * 255 * 255); //注目しているセルが勝ちなら更新しない if( G * strength.at<double>( i+neigh_y, h+neigh_x ) <= strength.at<double>( i, h )) continue; //注目しているセルが負けたのでラベルと強さを更新 converged++;//セルの強さが何個更新されたか next_label.at<double>( i, h ) = label.at<double>( i+neigh_y, h+neigh_x ); next_strength.at<double>( i, h ) = G * strength.at<double>( i+neigh_y, h+neigh_x ); } } } }
アルゴリズム部分はほんとにこれだけ。
ほかはGUIで操作しやすいようにだったり、画像に変換して見やすいようにしたりとかの処理です。
あまり考えずにプログラム作ったのでところどころおかしいですが、一応動くはずです。
ご自由にお使いください。
PHPUnitのインストール
自分の開発環境はCentOSサーバーを使っている。
1年前くらいに作ったのだが、あまりメンテナンスとかしてなかった。
というか、家の中でDLNAつかって動画・音楽を垂れ流しがメインなのでそうする必要がなかったのです。
しかし、友達となにかつくろうぜ!ってなってPHPを書くことになったのだけど、だったらちゃんとした開発を学ぶためにテストというものを実践しようじゃないか!と自分の中でなった。
で、PHPでテストというとPHPUnitというのが有名。
これをインストール仕様としたのだが、PHPUnitの前にPearで若干挫折仕掛けた。
なので解決方法を書いておく。
まずはPearをアップグレードしなければならないのだけど、PHPUnitの最新版を入れようと本家のサイトを参考にしても出来なかった。
原因はPearのバージョンにある、ということだったはず(1ヶ月くらい前の話なので忘れた)。
で、Pearをバージョンアップしようとしたら怒られた。
たしか依存しているパッケージが非推奨だからとかでインストールされず、他のパッケージがインストール出来なかったのだ。
$ sudo pear upgrade PEAR
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/modules/oauth.so' - /usr/lib/php/modules/oauth.so: undefined symbol: php_pcre_match_impl in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/modules/oauth.so' - /usr/lib/php/modules/oauth.so: undefined symbol: php_pcre_match_impl in Unknown on line 0
pear/PEAR dependency package "pear/Console_Getopt" downloaded version 1.3.1 is not the recommended version 1.2.3, but may be compatible, use --force to install
pear/Archive_Tar requires PEAR Installer (version >= 1.5.4), installed version is 1.4.9
pear/Console_Getopt requires PEAR Installer (version >= 1.8.0), installed version is 1.4.9No valid packages foundupgrade failed
で、今になって見返してみたら、--forceを付ければ無理やりだけどインストール出来ます、という注意書きが。
そういうわけで、--forceを付けてアップグレードを行った。
そしたらすんなりインストールされ、PHPUnitの最新版もすんなりインストールされた。
]$ sudo pear upgrade --force PEAR
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/modules/oauth.so' - /usr/lib/php/modules/oauth.so: undefined symbol: php_pcre_match_impl in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/modules/oauth.so' - /usr/lib/php/modules/oauth.so: undefined symbol: php_pcre_match_impl in Unknown on line 0
warning: pear/PEAR dependency package "pear/Console_Getopt" downloaded version 1.3.1 is not the recommended version 1.2.3
warning: pear/Archive_Tar requires PEAR Installer (version >= 1.5.4), installed version is 1.4.9
warning: pear/Console_Getopt requires PEAR Installer (version >= 1.8.0), installed version is 1.4.9
downloading PEAR-1.9.4.tgz ...
Starting to download PEAR-1.9.4.tgz (296,332 bytes)
...........................................done: 296,332 bytes
downloading Archive_Tar-1.3.9.tgz ...
Starting to download Archive_Tar-1.3.9.tgz (18,123 bytes)
...done: 18,123 bytes
downloading Console_Getopt-1.3.1.tgz ...
Starting to download Console_Getopt-1.3.1.tgz (4,471 bytes)
...done: 4,471 bytes
upgrade ok: channel://pear.php.net/Console_Getopt-1.3.1
upgrade ok: channel://pear.php.net/Archive_Tar-1.3.9
upgrade ok: channel://pear.php.net/PEAR-1.9.4
PEAR: Optional feature webinstaller available (PEAR's web-based installer)
PEAR: Optional feature gtkinstaller available (PEAR's PHP-GTK-based installer)
PEAR: Optional feature gtk2installer available (PEAR's PHP-GTK2-based installer)
To install use "pear install pear/PEAR#featurename"
エラー文ってちゃんと読まなきゃダメですねっていう教訓でした。
おそらく--forceを使わずに非推奨だったバージョンのパッケージだけバージョン指定すれば問題なくインストール出来たのだと思われますが、まぁ動いているのでいいでしょう。