2015年1月26日月曜日

tmux起動時にsshで自動でログインしログイン後にコマンドを実行する方法 その3

概要

その1
その2

ついにその3まで来ました
相変わらずシェルですが今回はサーバのロールごとにwindowを開いてくれるように改修しました

環境

  • CentOS 6.4 64bit Final
  • Bash 4.1.2
  • tmux 1.9a

スクリプト

コード

#!/bin/sh

#-- Configuration --#
name="session_name"
password="Please input your server's ssh password"
# key="/path/to/key.pem"

pane_define=(app db bat)
app=(apl001)
db=(db001 db002)
bat=(bat001)
#-- Configuration --#

tmux new-session -s ${name} -d

for j in ${pane_define[@]}
do
  pane_name=${j}
  eval ref="\${${pane_name}[@]}"
  eval ref_count="\${#${pane_name}[@]}"
  tmux new-window -t ${name} -n ${pane_name}
  count=0
  for i in ${ref}
  do
    echo "ssh ${i}"
    # tmux send-keys -t ${pane_name}.${count} "ssh -i ${key} ${i}" C-m
    tmux send-keys -t ${pane_name}.${count} "ssh ${i}" C-m
    sleep 5
    tmux send-keys -t ${pane_name}.${count} "${password}" C-m
    last_count=`expr ${count} + 1`
    if [ ${last_count} -ne ${ref_count} ]
    then
      tmux split-window
    fi
    (( count++ ))
  done
  tmux select-layout even-vertical
done

設定と動き

  • pane_defineに作成したいwindows名を作成したいだけ書きます
  • 記載したwindows名と同じ名称で配列を作成し、その配列にSSHするサーバ先を記載します
  • 配列1つごとに1つのwindowが作成されて、サーバの分だけwindowsが分割されます
  • 最後は平行に均等に並べ替えて完了です
  • 公開鍵認証の場合はkeyのコメントを外してください
  • nameには好きなセッション名を定義してOKです

イケてない点

  • パスワードを1つしか設定しないので、SSHする先のサーバが全部同じパスワードでなければならない

2015年1月24日土曜日

JavaからLuaスクリプトを実行してRedisにアクセスしてみた

概要

RedisはデフォルトでLua言語を使ったデータ抽出ができます
JavaのRedis用ライブラリJedisを使えばJavaからもLuaスクリプトを使うことができるのでその方法を紹介します

環境

  • Windows7 64bit
  • Redis 2.6.14
  • Java 1.8.0_25
  • Eclipse 4.4.1 Luna
  • Maven 3.2.1
  • Jedis 2.6.0

手順

今回はRedis内のHASH情報を取得するLuaスクリプトを紹介します

必要な環境の準備

ここでは詳細に構築方法は紹介しませんが環境はWindows7上のEclipseでソースコードを書きプロジェクトはMavenプロジェクトで作りました
Redisはfor Windowsをインストールしています(インストール方法はこちら
特につまる所はないと思いますが、Eclipse+Mavenは必須ではないのでJavaを開発、動く環境があればOKです

Luaスクリプトの実行

まずはJavaを使わずにLuaスクリプトだけでRedisにアクセスできるか試してみます
作業前にredis-serverを起動しておいてください

RedisでLuaスクリプトを実行するためにはevalという仕組みを使います
redis-cliを使ってRedisにアクセスしてください
そしたら以下のコマンドを実行するとHello Worldが表示できると思います

redis 127.0.0.1:6379> eval "return 'Hello World'" 0
"Hello World"

evalコマンドの説明を簡単にすると

  • 第一引数が実行するスクリプト
  • 第二引数がkeyの数
  • 第三引数がkey
  • 第四引数がargv

になります
keyとargvが不要な場合は0を指定するだけでOKです
keyとargvはそれぞれで複数指定することができます
ちょっとわかりづらいので具体的なkeyとargvの使い方です

redis 127.0.0.1:6379> hset myhash "key1" "value1"
(integer) 1
redis 127.0.0.1:6379> eval "return redis.call('HGET', KEYS[1], ARGV[1])" 1 "myhash" "key1"
"value1"

複数のkeyを渡したい場合や複数のargvを渡されなければいけないコマンド(HGETやZADDなど)に使う感じです

redis.callを呼び出すことで実際にRedisのコマンドを実行することができます
第一引数に実行したいコマンドを文字列で渡します
第二、第三引数以降でそのコマンドを実行するための引数を指定します
また同じようなメソッドでredis.pcallというものがあり違いはエラーが発生したときにそこで終了するかしないかです、callは終了してpcallはエラーを捕捉しつつ次の処理に進みます

Luaスクリプトの作成

とりあえずredis-cliを使ってLuaを実行できるようになりました
次はLuaスクリプトファイルを作成してRedisにアクセスしてみます
実際にJavaから使う場合もスクリプトファイルに記載した内容をJavaに記述するのでスクリプトファイルに落として損はないと思います
また、Luaスクリプトでの処理が複雑な場合にはスクリプトファイルにしたほうが書きやすいし管理もしやすいです

では、先ほどと同様にHashデータにアクセスするためのスクリプトを作成していきます
せっかくスクリプトファイルにするのでちょっとプログラムっぽい感じにしてみます

local keys = redis.call('keys', KEYS[1])
local hash_info_map = {}
for i,key in ipairs(keys) do
    local hash_info = {}
    local key1 = redis.call('HGET', key, "key1")
    local key2 = redis.call('HGET', key, "key2")
    hash_info[1] = key1
    hash_info[2] = key2
    hash_info_map[i] = hash_info
end
return hash_info_map

指定されたKEYSを含むkey情報を持ってきてそのkeyに対してそれぞれHGETをしてHashの値を取得します
Hash構造なので一旦リストにデータを保存してからそのリスト情報を更にリストに保存したデータを返却します

では実行してみます
今度はredis-cliで事前に会話モードに入る必要はありません
redis-cliのオプションに「–eval」を指定してその引数にLuaスクリプトファイル名を指定します

$ ./redis-cli.exe --eval test.lua 'myhash*'
1) 1) "value1"
   2) "value"
2) 1) "value2"
   2) "value"
3) 1) "value3"
   2) "value"
4) 1) "value4"
   2) "value"

上記の場合はmyhashで始まるHashデータの各key情報が持つ値を取得して返してます

ちなみに事前に入れたデータは以下のとおりです

hset myhash key1 value1
hset myhash2 key1 value2
hset myhash3 key1 value3
hset myhash4 key1 value4
hset myhash key2 value
hset myhash2 key2 value
hset myhash3 key2 value
hset myhash4 key2 value

これでスクリプトファイルからも実行できるようになりました
最後にJavaから操作してみます

Javaへの組み込み

環境準備で説明したようにJedisのライブラリを使用するので事前に使用できるようにしておいてください

いきなりですがソースコードです
処理内容はスクリプトファイルで実施した内容と同じです

package test;

import java.util.List;

import redis.clients.jedis.Jedis;

public class LuaTest {

    private final static String SCRIPT = "" +
            "local keys = redis.call('keys', KEYS[1])" +
            "local hash_info_map = {}" +
            "for i,key in ipairs(keys) do" +
            "    local hash_info = {}" +
            "    local key1 = redis.call('HGET', key, 'key1')" +
            "    local key2 = redis.call('HGET', key, 'key2')" +
            "    hash_info[1] = key1" +
            "    hash_info[2] = key2" +
            "    hash_info_map[i] = hash_info " +
            "end " +
            "return hash_info_map";

    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost");
        List<List<String>> o = (List<List<String>>) jedis.eval(SCRIPT, 1, "myhash*");
        for (List<String> attr: o) {
            System.out.println(attr);
        }
    }

}

実行結果は以下のとおり

[value1, value]
[value2, value]
[value3, value]
[value4, value]

スクリプトファイルの内容をそのまま貼り付けたけなので特に説明する必要もないかもしれないですがポイントだけ

スクリプトの内容はString型で宣言すればOKです
サンプルのソースでは+を文字列で連携して見やすくしていますが全部1行に書いても問題ないです
ただ、Lua文法としては成立していなければいけません
ソースを良く見るとわかりますが、for文の始まりと終わり、endの前の1文の前にスペースが入っています
要は単純な文字列なのでJavaとしては文字がつながってしまうので文法エラーになる感じです
複数行にまたいでJavaに書くときは文末にスペースを入れておくのが無難です

あとはコールするメソッドはJedisクラスのオブジェクトに対してevalメソッドをコールします
これもインタフェース的にはスクリプトを直接実行したときと同じで「スクリプト」「keyの数」「key」「value」です
valueがある場合は、引数を4つで呼び出せるevalメソッドがあるのでそれを呼べばOKです
keyやvalueが複数ある場合は配列で渡せばOKです

また、evalの返り値は適切な型にCastしてあげる必要があります
今回はList内にListを突っ込んでいるのでList<List<String>>で受け取っています
単純のkey-valueの場合はString型でSET型の場合はListで受け取れます
間違った型で受け取ろうとするとCastExceptionが発生するのでわかると思います
あとはとりあえずObjectで受け取ってinstanceofで分岐することも可能だと思います

最後に

紹介は以上です
RedisはもともとLuaでアクセスできる仕組みを持っているので簡単にアクセスすることができました

そもそもなんでLuaを使うのかというポイントですが例えば処理対象のkeyが大量にありそのkeyをJava側で持ってきてからfor文を回すとJVMは遅いので非常に時間がかかったりします
そんなときにLuaスクリプトを書いて処理をRedis側に任せることで高速に処理できるようになる
のではないかと思っています
必ず効果が出るかどうかはやってみないとわかりませんが少なくともJVMよりかはRedis上での処理のほうが早いので検討する価値はあると思います

2015年1月23日金曜日

PubNub使ってみた

pubnub

概要

PubNubとは「メッセージングAs a Service」と呼ばれる分野のサービスでメッセージングするための中央サーバ(ブローカー)をホスティングしてくれるサービスです
よくpub/subやMQTTといったコンテキストで登場するサービスかと思います
今回は簡単なJavaScriptのサンプルが動作するまでの使い方を紹介したいと思います

環境

  • Mac OS X 10.8.5
  • Firefox 35.0(JavaScript + HTML)
  • PubNub 2015/1/22時点

使ってみた

アカウントの作成

利用するにはアカウントの登録が必要です
サイトにアクセスして「GET STARTED」をクリックします
top.png

必要な情報(ユーザ名、パスワード、会社名、電話番号、メールアドレス)が結構多いですが必須なので入力して「CREATE FREE ACCOUNT」をクリックします
regist.png

アカウントが作成できるとダッシュボード的なものに遷移します
dashboard.png

今回はQuick Start Guideを実施してみたいと思います

Get Started

サンプルコードはJavaScript+HTMLで書いて動作確認はブラウザ(Firefox)を使います

PubNubクライアント(SDK)のインストール

インストールと言っても公開されているJavaScriptをHTMLから読み込むだけです
以下、インストールしている部分のサンプルのコードです

  • test_pubnub.html
<html>
<head>
<title>test pubnub</title>
</head>
<body>
<h3>Welcome PubNub Test</h3>
<!-- Include the PubNub Library -->
<script src="https://cdn.pubnub.com/pubnub.min.js"></script>

<!-- Instantiate PubNub -->
<script type="text/javascript">
var PUBNUB_demo = PUBNUB.init({
  publish_key: 'Your Publish Key Here',
  subscribe_key: 'Your Subscribe Key Here'
});
</script>
</body>
</html>

Your Publish Key HereYour Subscribe Key Hereにキー情報を入力します
キー情報はダッシュボードで確認することができます
ダッシュボードにアクセスしPublish KeySubscribe Keyをそれぞれ入力します
key_info.png

今回はpublisherとsubscriberの2つのコードを作成します
2つのコードはこれを元に作成していきたいと思います

とりあえずこの状態でHTMLファイルをブラウザで開いてFirebug等のコンソール機能を使ってみると通信している状況がわかります
GETの200が返ってきていれば設定したキーの情報が合っていることがわかります
firebug_console.png
ブラウザを開いていると定期的に通信を続けるので確認できたら閉じてしまってください

Subscriberの作成

Subscriberを作成します
Subscriberはメッセージを受信する側のことです

先ほどのインストール時に作成したHTMLファイルをベースにSubscribeするためのコードを追記します
追記した全体のコードは以下の通りです

  • test_pubnub_sub.html
<html>
<head>
<title>test pubnub</title>
</head>
<body>
<h3>Welcome PubNub Test</h3>
<!-- Include the PubNub Library -->
<script src="https://cdn.pubnub.com/pubnub.min.js"></script>

<!-- Instantiate PubNub -->
<script type="text/javascript">
var PUBNUB_demo = PUBNUB.init({
  publish_key: 'Your Publish Key Here',
  subscribe_key: 'Your Subscribe Key Here'
});

//Subscribe to the demo_tutorial channel
PUBNUB_demo.subscribe({
  channel: 'demo_tutorial',
  message: function(m){console.log(m)}
});
</script>
</body>
</html>

こいつを使ってメッセージを受信します

Publiserの作成

Publisherを作成します
Publisherはメッセージを送信する側のことです

こちらもベースのコードに追記するだけです
全体のコードは以下です

  • test_pubnub_pub.html
<html>
<head>
<title>test pubnub</title>
</head>
<body>
<h3>Welcome PubNub Test</h3>
<!-- Include the PubNub Library -->
<script src="https://cdn.pubnub.com/pubnub.min.js"></script>

<!-- Instantiate PubNub -->
<script type="text/javascript">
var PUBNUB_demo = PUBNUB.init({
  publish_key: 'Your Publish Key Here',
  subscribe_key: 'Your Subscribe Key Here'
});

// Publish a simple message to the demo_tutorial channel
PUBNUB_demo.publish({
  channel: 'demo_tutorial',
  message: {"color":"blue"}
});
</script>
</body>
</html>

Subscriberとほぼ変わりませんがPublisherもこれでOKです

動かしてみる

作成したSubscriberとPublisherを動かしてみます

まずはSubscriberを動かします
test_pubnub_sub.htmlをブラウザで開きましょう
特に何も起きませんがまずはこれでOKです
一応firebugのコンソールで通信状況を確認して「200 OK」になっていることを確認してください

次にtest_pubnub_pub.htmlを動かします
もう1つブラウザを開くかタブを作成してファイルを開いてください
ファイルを開いた瞬間メッセージが送信されます
送信されるメッセージは「{color=”blue”}」という簡単なJSON情報です

メッセージが送信された瞬間Subscriber側のブラウザでコンソールを開くとメッセージが送信されていることがわかると思います
message.png
上記のようになれば、ちゃんとSubscriber側でメッセージを受信できていることになります

いちいちコンソールをみるのが面倒という場合にはsubscribeメソッドを以下のように書き換えればHTMLとしてブラウザ上に表示されます

//Subscribe to the demo_tutorial channel
PUBNUB_demo.subscribe({
  channel: 'demo_tutorial',
  message: function(m){
    console.log(m)
    target = document.getElementById("output");                                                                  
    target.innerHTML = m.color;
  }
});

今回の紹介は以上です

送信しているメッセージのサイズが小さいということもありましたが、あまりネットワークのレイテンシーを感じることはありませんでした
今回、紹介したのは簡単なpub/subメッセージングのサンプルでしたが、他にも

  • 溜めたメッセージを解析するサービスや
  • iOSやAndroidのメッセージをプッシュ送信できるサービス

といった様々なバックエンドサービスを提供してみたいなので興味があれば触ってみるといいと思います
SDKもJavaScript以外にたくさんのSDKを提供しているのでいろんなクライアントで使えそうです

2015年1月20日火曜日

Cygwin上でWindowsのプロセスをkillする方法

概要

Cygwin上で動作したプロセスはkillコマンドで停止できますがWindows上で動作しているプロセス(例えばexplorer.exeとか)はkillコマンドでは停止できません
Windows上のプロセスを停止したい場合はタスクマネージャを起動してそこから停止したいプロセスを停止します

いちいちタスクマネージャを起動するのも面倒なのでCygwin上でWindows上のプロセスを停止する方法を紹介します

環境

  • Windows7 64bit
  • Cygwin 1.7.32

実行方法

まずはWindows上で動作してしているプロセスのプロセス番号を取得します
普通は「pa aux」とかを使うと思いますがこれだとWindows上のプロセスを表示することができません

以下のコマンドでWindows上のプロセス番号を確認することができます

ps -efW

上記のオプションを使うことでCygwin上でWindows上のプロセス番号を調べることができます
例えば「ps -efW | grep explorer」とか実行するとexplorer.exeのプロセス番号を取得できます

プロセス番号がわかったら実際にkillしてみます
普通は「kill 9999」みたいな感じでkillしますがWindows上で動作しているプロセス番号を指定すると「No such process」と言われてkillできません

代わりに「taskkill.exe」というコマンドを使用します
使い方は以下の通り

cmd /c taskkill.exe /pid 9999 /F

ちょっと長いですが「9999」の部分にWindows上のプロセス番号を指定してください
上記の例では「/F」を指定していますがこれは強制終了のオプションです
killコマンドで言うところの「-9」にあたります
普通は指定しなくてもいいですが、プロセスが停止できない場合には指定してみてください

2015年1月15日木曜日

MQTT as a Serviceの「sango」を使ってみた

sango_logo

概要

MQTT as a Serviceであるsangoを使ってみました
MQTTとは非常に軽量なメッセージングプロトコルでIoTやM2Mといったコンテキストで最近聞かれるようになりました
技術自体は1999年にスタートしており歴史があります
ここではMQTTに関しては詳しい説明はしませんがWeb上に多くの情報があるので興味のある方は調べてみてください

sangoはMQTTを簡単に使うことができるサービスです
今回はサービスの登録から簡単なメッセージのやり取りができるRubyのサンプルまでを紹介します

環境

  • Mac OX X 10.8.5
  • Ruby 2.1.2p95 (クライアント)
  • ruby-mqtt 0.3.1 (クライアント)
  • sango 2015/1/15時点

サービス登録

まずはサービスサイトにアクセスします
アクセスすると「新規登録/ログイン」というボタンがあるのでクリックします
するとGithubアカウントでサインアップするように求められるのでGithubのアカウントを使ってサインアップします
(当たり前ですがGithubアカウントがない場合は作成しておいてください)

ログインするとsangoのダッシュボードにアクセスします
アクセスするとMQTTのbroker(サーバ)情報が表示されていると思います
dashboard.png

これでもうMQTTを使うための準備は整いました
トピックとかWebSocketとかいろいろと気になるワードもありますがまずは使ってみます

サンプルクライアントの作成と実行

gemのインストール

gem コマンドでインストールします

gem install mqtt

無事インストールできればOKです

サンプルクライアント

pub_sango.rbとsub_sango.rbという2つのスクリプトを作成します
publish(メッセージ送信)をpub_sango.rbで実行しsubscribe(メッセージ受信)をsub_sango.rbで実行します
まずはサンプル全体です

  • pub_sango.rb
require 'mqtt'

MQTT::Client.connect(
                     :host => 'lite.mqtt.shiguredo.jp',
                     :port => 1883,
                     :username => 'Please input your username',
                     :password => 'Please input your password') do |c|
  c.publish('Please input your topic', 'message')
end
  • sub_sango.rb
require 'mqtt'

MQTT::Client.connect(
                     :host => 'lite.mqtt.shiguredo.jp',
                     :port => 1883,
                     :username => 'Please input your username',
                     :password => 'Please input your password') do |c|
    # If you pass a block to the get method, then it will loop
    c.get('Please input your topic') do |topic,message|
    puts "#{topic}: #{message}"
  end
end

ポイントを説明します

sangoへの接続

まずsangoにコネクションするときに「host」「port」「username」「password」を指定する必要があります
これらはsangoのダッシュボードで確認することができ、それぞれ

  • host・・・ダッシュボードの接続先のホスト名の部分を入力
  • port・・・ダッシュボードの接続先のポート部分を入力
  • username・・・ダッシュボードのユーザー名を入力
  • password・・・ダッシュボードのパスワードを入力(パスワードを表示するには鍵マークをクリックします)

を入力すればOKです、サンプルコード中の情報はダミーなので適宜、ダッシュボードの値に変更してください
これらの情報はpublisherとsubscriberそれぞれのスクリプトで入力する必要があります

usernameとpasswordに関してはすべてのbrokerで必要というわけではありません、sangoに関してはパスワード認証でセキュリティを高めている感じです

トピックの指定

トピックとはメッセージを保存しておくための器のようなものでメッセージを送受信する際はトピックを指定します
今回はpublishメソッドとgetメソッドの引数にトピックを指定する必要があります
指定するべきトピックの情報もsangoのダッシュボードで確認することができ「アクセス先トピック」の部分を入力してください

トピックの指定にはワイルドカードが存在し「#」を指定するとすべてのトピックという意味になります
おそらくsangoのダッシュボードで確認できるトピック名は「username/#」と言う表示になっており、これを指定するとすべてのトピックに対してメッセージを送受信することになります

「#」の部分は好きな文字列に変更することができます
例えば「username/test」という風にpublishメソッドの引数に指定すれば「username/test」という1つのトピックにだけメッセージが送信されることになります
もちろんgetメソッドの引数にも同じトピックを指定しないと送信したメッセージを受信することができません

こんな感じで「#」の部分は好きなトピックを指定してあげてください

サンプルの実行

必要な情報を入力したらサンプルを実行してみましょう
ターミナルを2つ起動しておいてください

まずはsub_sango.rbを先に実行しておきます
するとメッセージの待機状態に入ります

ruby sub_sango.rb

この状態でpub_sango.rbを実行してみましょう

ruby pub_sango.rb

するとsub_sango.rb側で待機していたコンソールにpublishしたメッセージが表示されると思います
更にpub_sango.rbを実行するとまた送信したメッセージが表示されると思います
このようにsubscriberは実行されると常に接続状態となり、publisherからのメッセージの送信を常に待機しています
ちなみにこの状態でsangoのダッシュボードを確認するとコネクション数が1/6になっていることを確認できると思います
number_of_connection.png

超簡単ではありますが今回のサンプルは以上です
今回はWillやRetainといったメッセージングに特化した機能に関しては全く触れませんでしたがMQTTにはメッセージングに特化したシンプルで強力な機能がたくさんあります
そのあたりWebにいろいろと情報があると思いますので興味のある方は調べてみるといいと思います

参考サイト

2015年1月7日水曜日

Androidで実行中のメソッド名をロギングする方法

概要

タイトルの通り
Androidで実行さればメソッドのメソッド名をLogCatに出力する方法を紹介します

環境

  • Mac OS X 10.8.5
  • Eclipse Kepler 4.3
  • Android SDK Tools 24.0.2

方法

Log.i("my-app", "Start the method " + Thread.currentThread().getStackTrace()[2].getMethodName());

でOK

getStatckTrace()[2]でindexが2になっているにハマった
0がcurrentThreadで1がgetStackTraceが返ってくるみたい
Androidのバージョンにもよるのか?
とりあえずこれで取得できた

2015年1月6日火曜日

Phingがインストールできない

概要

以下のようなコマンドを実行したら

pear channel-discover pear.phing.info
pear install --alldeps phing/phing

以下のようなエラーが出てインストールできませんでした

Failed to download pear/VersionControl_SVN within preferred state "stable", latest release is version 0.5.2, stability "alpha", use "channel://pear.php.net/VersionControl_SVN-0.5.2" to install
Failed to download pear/VersionControl_Git within preferred state "stable", latest release is version 0.4.4, stability "alpha", use "channel://pear.php.net/VersionControl_Git-0.4.4" to install
Unknown remote channel: pear.phpunit.de
Unknown remote channel: pear.phpunit.de
WARNING: "pear/PEAR_PackageFileManager" is deprecated in favor of "pear/PEAR_PackageFileManager2"
Failed to download pear/Services_Amazon_S3 within preferred state "stable", latest release is version 0.4.0, stability "alpha", use "channel://pear.php.net/Services_Amazon_S3-0.4.0" to install
Unknown remote channel: pear.phpunit.de
Unknown remote channel: pear.phpunit.de
Unknown remote channel: pear.phpdoc.org
WARNING: "pear/PHP_CompatInfo" is deprecated in favor of "channel://bartlett.laurent-laville.org/PHP_CompatInfo"
Unknown remote channel: pear.phpunit.de
Failed to download pear/XML_Serializer within preferred state "stable", latest release is version 0.20.2, stability "beta", use "channel://pear.php.net/XML_Serializer-0.20.2" to install
WARNING: "pear/PHP_CompatInfo" is deprecated in favor of "channel://bartlett.laurent-laville.org/PHP_CompatInfo"
phing/phing can optionally use package "pear/VersionControl_SVN" (version >= 0.4.0)
phing/phing can optionally use package "pear/VersionControl_Git" (version >= 0.4.3)
phing/phing can optionally use package "channel://pear.phpunit.de/PHPUnit" (version >= 3.6.0)
phing/phing can optionally use package "channel://pear.phpunit.de/PHP_CodeCoverage" (version >= 1.1.0)
phing/phing requires package "pear/Archive_Tar" (version >= 1.3.8), installed version is 1.3.7
phing/phing can optionally use package "pear/Services_Amazon_S3" (version >= 0.3.1)
phing/phing can optionally use package "channel://pear.phpunit.de/phpcpd" (version >= 1.3.3)
phing/phing can optionally use package "channel://pear.phpunit.de/phploc" (version >= 1.6.4)
phing/phing can optionally use package "channel://pear.phpdoc.org/phpDocumentor" (version >= 2.0.0b7)
pear/Net_Growl requires PHP extension "mbstring"
pear/Net_Growl can optionally use package "channel://pear.phpunit.de/PHPUnit" (version >= 3.6.0)
pear/PEAR_PackageFileManager_Plugins requires package "pear/XML_Serializer" (version >= 0.19.0)
pear/PEAR_PackageFileManager requires package "pear/PEAR_PackageFileManager_Plugins"
pear/PEAR_PackageFileManager2 requires package "pear/PEAR_PackageFileManager_Plugins"
No valid packages found

この対処方法を紹介します

環境

  • CentOS 6.5 (Final) 64bit
  • PHP 5.3.3
  • PEAR 1.9.4

対処方法

インストールコマンドを実行する前にコマンドを実行してください

pear clear-cache
pear config-set preferred_state alpha
pear install --alldeps pear.phing.info/phing-2.7.0
  1. キャッシュを削除して
  2. 安定版以外のパッケージもインストールする設定をして
  3. channelのフルネームを指定してphingをインストール

します
対処した段階でのphingの最新版が2.9.2だったのですが、それだとNo valid packages foundになってうまくインストールできませんでした

とりあえずphingをインストールするのが目的だったのでこれで解決しました