「weblog」カテゴリーアーカイブ

AgICで非接触センサ

AgICは回路を書いたり印刷するために使うというのは重々承知で、他にも何か面白い使い方は無いかしら…と言うよりも、あー、何かこれに使えるかも!?と思ってやってみたらイケた。

自分はKinectチックな色んな3Dセンサが大量にあるのもあって、非接触とかジェスチャで何かをやったり距離のデータを使ってゴニョゴニョする事が多い。時代はそう非接触(多分)。触らないで何かを操作したい、ジェスチャーとかでもね。

という事で、AgICを紙に塗りたくって非接触センサ(静電容量)として使えるんじゃねーかー?的にやってみたら、バッチリいけんじゃん。まずは定番のLEDちかちか。

「あ」というAgICで書いた文字(深い意味は無い)の所に手を近づけるとLEDが光る。めっちゃ近づけると、LEDが強く光っている事が分かると思う。もちろん、近づける距離で取れるデータが変わるから、「あ」という文字にどれくらい近づいたか距離も分かる。(というか、その距離のデータでLEDの光の強さを変えている)

んで…1~3の文字を書いた物では…こんな感じで、文字の上に手をかざすと青・赤・緑で光るLEDが変わる。まぁ実験の1つということで。

ということで、回路の他にも何かデザインを絡めて非接触センシングの1つとして利用する事も使い方の1つとしてあると思われ。

aliexpressでお買い物

Arduino Pro Miniを大量に使いたくなった。色々と探してみたけど、どうやっても1個あたり1,000円位はする。もしこれを30個とかなら…えー3万円オーバー!?ってことで、何気に切ない。
という事で、互換ボードでも良いや!!と思って、探してみたら…ありましたよ、アリババさんとこに。あ、正確にはここ

AliExpressという所。まぁ、安けりゃ何でもいいや!!と思いつつ、ポチってやったぜ!!
一応、色んな意味でチャイナさんにカード情報を渡すのも怖いというのも若干あったりするから、Vプリカで使い捨てカードをゲットした。
このAliExpressの面白いのが、物を買う時は一応カードで買う訳だけど、ちゃんと届いて確認するまで(Confirm Order Receivedボタンをポチるまで)、実際のカード決済がされない。
つまり届いて「あんじゃこりゃ!?」だったり、届かなかったりしたらExpipreしてカードから支払いはされないという、買い手に大分厚い保護がある。とは言え、カード情報を登録するのもイヤだったから、Vプリカを使った。

今回買ったのは、こちらの2品

まずは、Arduino Pro Mini 5V互換、10個で$21.24。つまり、1個あたり200円ちょっと(www

そして、不安だったから、こちらも。Arduino Pro Mini 3.3V互換、10個で$29.49。こっちは1個あたり300円ちょっと(www


どちらも送料が日本向けには無料ということで、本当に大丈夫なんだろうか…という一抹の不安はあった。

そして、予備で何個かあっても良いだろうということで、5Vの方を3lot(30個、$60ちょい)、3.3Vの方を1lot(10個、$30くらい)でポチってやった。送料無料だから、コストは以上。
そして…3.3Vの方が届いた。まずは梱包はこんな感じ。

開けると…一応プチプチで梱包されてる。

そしてプチプチを開けると…

まともだ…かなり普通に来るじゃん。くそー、もうちょっとヘンテコに来ると期待していたのに、めっちゃ普通に来た。見事に期待を裏切ってくれたな。梱包無しで、どれか破砕して来る位の勢いを期待していたのに…それにしても、これで1個あたり300円は安すぎるぞ!! 明らかにパチ物&まともに動くとは全く期待していないものの、10個これで一応確保。

もう少しすると5Vの方も来る。別の業者にオーダーしたから、そっちもどんな梱包で来るのかは密かに期待している。(5Vの方も最初は1lot, 10個でオーダーしたけど、気が変わってキャンセルして3lotでオーダーし直した。その時、向こうの人とチャットで英語で直接やり取り出来たり、なかなかAliExpressの仕組みは日本の赤い色が主体のECサイトよりも格段に良い感じがした…時期によって届くの遅くなったりするぞ!!とか、現地情報を教えてくれたりした。)

んで、ちゃんと届いたらConfirmして支払いボタンをポチって、その後、売り手の評価があるから、全く面白くもないし、悔しいけど星5をくれてやった。オーダーから約1週間ちょいで到着。

LightBlue Bean

LightBlue Beanが先週届いて、少し触って放置していたけど…ちょっとメモで書いておく。LightBlue Bean は確か去年だったか(忘れた)、KickStarterだったかプレオーダーで予約をしたのが4個来ていた。今、オーダーページを見てみたら$30(1個だけ)、$28.5(4個)でプレオダー出来るみたい。
この子のスペックは次のような感じ。

MCU : Atmel ATmega328P @ 8MHz with 32KB Flash, 1KB EEPROM, 2KB SRAM
Bluetooth :  LBM313 Module with Texas Instruments CC2540, 256 KB Flash. Bluetooth range: 30.5m. Power consumption in sleep mode: 0.9μA. BLE compatible.
I/O : 4 PWM pins, 2 Analog inputs, 8 GPIO,  I2C and SPI
Sensor:  3軸加速度センサ、温度センサ
その他:フルカラーLED

面白いのが箱にコイン電池付きで発送されてきて、AppStoreからiPhoneのアプリをダウンロードして、すぐBTで接続&動作確認が出来るというお手軽さ。

実際のサイズはこんな感じ。かなり小さい。温度センサは最初はスペックに無かったはずだけど、追加で付いたのかしら。実験してみたら、バッチリ温度が取れた。コイン電池でこのスペックは割と良い感じだと思う。接続は次のような感じ。

Analogが2個しか使えないけど、まぁ良いかって感じ。このピンの2列目以下はただのユニバーサル基盤のようなもんで、パキっと折っちゃえば更に小さく使える。

iPhoneにアプリを入れて接続するとこんな感じで見える。

IOをいじったり、色を変えたり加速度センサの値をモニタリングとか。

そして、ArduinoのIDEから直接使える。使い方はこちら。Macで5分もあれば設定&すぐプログラム出来た。他にもiOS/OSX向けのSDK&ソースもgithubで公開していた。リファレンスを見ただけだけど、BTでのスキャン・接続・センサの値を取得するAPI…etcとかが使えるみたい。あと、まだWin/Android向けは無いけど、Win向けは絶賛開発中とのこと。開発スケジュールはアップされていた。

加速度センサでLEDが変わるArduinoのプログラム(exampleにある)のはこんな感じ。

void setup() {
    // initialize serial communication at 57600 bits per second:
    Serial.begin(57600);
}
 
// the loop routine runs over and over again forever:
void loop() {
    AccelerationReading accel = {0, 0, 0};
 
    accel = Bean.getAcceleration();
 
    uint16_t r = (abs(accel.xAxis)) / 4;
    uint16_t g = (abs(accel.yAxis)) / 4;
    uint16_t b = (abs(accel.zAxis)) / 4;
 
    Bean.setLed((uint8_t)r,(uint8_t)g,(uint8_t)b);
 
    Bean.sleep(50);
}

あとはサンプルで、光センサを付けて光ったら音が鳴るテルミンなる物とかもプログラムと一緒に紹介してあったり、とりあえずゲットしたらすぐ遊べる感じ。値段($30-28.5)とBLE/3軸加速度/温度センサ、Arduino IDEでのプログラム環境を考えるとアリと思われ。
若干アレなのが…もし大量に使う場合、プログラムの流し込みがBT経由になるからちょっと大変かもね…って所くらいかな。数個くらいなら、USBケーブル使わないで使えるし全然アリ。

Maker Faire Taipei 2014

Maker Faire台北の様子を写真を中心にアップしていく。日本でもワークショップをやった事が無いのに、初めてのワークショップは台北でというオマケ付き。ちなみに、同じ週の前半にBay Areaに行って来ていて、その同じ週末は台北で展示とワークショップという何気に過酷スケジュール。

会場はこんな感じ。バルーンもあがってこれからだね!!って感じがする。

会場の外観。緑に包まれている。

この一帯は、何て言うのかなー。映画館、ライブハウス(℃-uteなる日本のアイドルがライブをしていた)、アートギャラリー多数なカルチャーエリアって感じ。

会場近くに何だこれ…?と思って見てみたら、全部ASUSのマザーボードだった。左側から年代毎に並んでいる。圧巻。

会場はこんな感じ。めっちゃ広い。右上の3Dプリンタで出したと思われるオブジェが素敵。

そして、人もめっちゃ多い。満員電車のような、歩く隙間が全く無い感じ。

何気に重要展示ということで、パンフデビューしていた。

スライムで遊ぶちびっ子達。中国語は何を言っているのかサッパリ分からないっす。あと、これとDepth+Drone物で公開しているGithubを使っているよ!!という人も居たりして、まさか台北で使っている人が居るとは!!って感じ。

FourBeatはここでも、バンバン遊ばれていました。机が揺れまくり!!

BLEでリモートで光るもの。ロウで出来ている感じ。裏に基盤が仕込んである。ロウをLEDで光らせるとこんなに素敵になるのか!!と。

微生物アート

電極が仕込んであって、触れると音が鳴るゆり。

3Dプリンタもの

メインのワークショップ。光るスライムを作るワークショップ。ジュールシーフ回路で単4電池1本でLEDを光らせて、スライムを作ってつっこんで光らせるといった感じ。凄い人が来て、予約空きで待っている人達も…めっちゃ緊張した。

事前にKeynoteで作って、中国語に翻訳してもらった資料を使いながら、自分の右側に居る方は日本語->中国語の通訳さん。

ノリツナ師作成のコイルキットと、日本から持参のスライムの材料を使って、参加者全員できたー!!

事前に、通訳さん(Maker Editorだった)と話していたら、多分誰も出来ないと思います…と言われて少し凹んだ。うちらの前はクッキーを焼いていたそうで、回路は厳しいんじゃないか…と。ただ、これで何とかやってやろう!!と思えた。

全員みごと完成。ノリツナ師と1時間があっと言う間。時間の感覚がめっちゃ短かった。そして2日間の展示もあっと言う間に終わった感じ。ワークショップ後は、もう脱力だった。

こちらはナイトマーケット。

凄まじいサイズの唐揚げ。人の顔以上、40cm以上はあったと思われ。3口位たべて、脂っこくてすぐギブした…

夜はほとんど屋台で食べたと思う。安くて美味しい。

 

 

 

 

システム監視のetc

Web・インターネットサービスは初期開発もだけど、それ以上に運用の方が期間的に非常に長い。一度公開したら、「運用期間 >>> 初期開発期間」という具合に運用期間の方が圧倒的に長い。

よく監視で何を見て、どうすれば?というのを聞かれたりするけど、確かにそういう何を監視してどうするか?といった部分で経験的な所や監視ツールの説明はあるけど、Web上にあまり情報が無いような気がする。特に開発側はあまり意識しないで、リリース&開発優先!!という流れもあったりするけど、基本的な所だけでも意識しておいた方が良い気がする。

Nagios/Cacti/Munin/Zabbix…etc とか運用監視ソリューションを使って監視をしよう!!というのよく見たりするけど、それはツールの話であって、そもそも監視って何で?何の役に立つの?という所を書き残しておくことは必要かなと(大体はSNMPだし)。いきなりツールの話をしちゃいけないような気が若干…ってことで、自分の経験的な所も含めて書いてみる。

 

– 運用監視って?
前提として、「監視をしていないシステムは止まっているのと一緒」だと思っている。
監視&確認されないシステムが正常に稼働しているかどうか?は24時間365日ベタ付きで見ていない限り、「ちゃんと動いています!!」と言えない。もちろん、どこまで監視用の設備を用意するかどうか?といったコスト見合いもあるけどね。
更に監視は障害が発生した時の検知・原因分析や情報を残しておく事で、運用におけるスケーラビリティ・増強についての指針、ボトルネックや問題解決の特定といった情報のベースにもなる。そこで監視を行う理由としては以下がある。

1. 正常に稼働している事を確認する
2. 何かシステムに問題があった時の検知を行う
3. システムにおけるボトルネック・問題発生後の原因分析
4. スケーラビリティ・増強を検討する際の指針

 

– 何を監視するのか?
監視をキーワードに書籍とか何かを見ると長々と書いてあったり、監視用ミドルの話が多いと思うけど、視点として大体は次を覚えときゃOKと思っている。

1. 死活
2. リソース
3. プロセス
4. ログ
5. サービス・アプリ(optional)

これらの監視を行って、何か問題があればメール(携帯直撃は当たり前)で通知が行われる。つまり、[監視]-(問題発生)->[通知]->[対応]といった一連の流れになる。
ここで前後するけど、監視には「インフラ・ネットワーク」「OS以上のレイヤーであるシステムアプリ周り」という2つの側面があって、どちらがどこまで監視を行うか?どちらに問題があるのか?はよく話に上がる(いわゆる責任分解点というやつ)。ここでは、OS以上の層について対象としておく。

1-5は何なのか?というと次の通り。

 

1. 死活
これはその名の通り、サーバ・ミドルが死んでいるのか活きているのか監視を行う。よく対象とするのは、

– OSが稼働しているかどうか(ping)
– ミドルが稼働しているかどうか(Web:telnet/wget, DB/Memcache…その他ミドル:接続する)

というのが基本になる。OSの稼働は対象のIPに対してpingを打つ。サーバが稼働していればレスポンスが戻ってくるというもの。またミドルに関しては実際に接続して、対象のミドル・ポートに対して接続できる事といった感じ。OSの死活はもちろん、経路上のNWの問題も検知する事が出来たりする。
ただし残念な事だけど、たまにこのどちらも稼働していても、対象のサーバに接続できないという事もあったりする。

 

2. リソース
これは、CPU・メモリ・ディスク、LoadAvg、Connection数といったOS上の統計情報、ミドルが持っている統計情報から、安定稼働の状態で推移しているかどうか監視を行う。過負荷な状態・データファイルを大量に使っている・スレッド数が凄いことになってるー!!…etc等をフックに、システムの増強・問題点の対応・分析を行うことになる。
ここで、インフラ・ネットワーク的な所だと、NIC&ポート・ファン・電源・ディスクといった機器リソースの監視等もあったりする。

死活もだけど通知にはよく何種類かあって、Warning, Criticalという警告レベルがある。例えばメモリ使用量が7割を超えたらWaring、9割を超えたらCrititalというように、通知される警告レベルに段階を設定する事で、急転直下で「突然ヤバいぜ!!」(Critical)という事が無くなる。

 

3.プロセス
これもその名の通り、OS上で動いているプロセス数を監視する。「プロセスが無くなったら止まっているんだし、死活で分かるじゃん」とパッと思うかも知れないけど、forkや何かバッチでプロセスが大量生成されていないか?サービスレベル(Apache/DB)以外の物で確認が必要なプロセスがあった時のも含まれる。

 

4.ログ
これはOSが吐き出すsyslogもだけど、アプリケーションが吐き出すログも対象にして、「ログにこの文字(CRITICAL)が含まれていたら、何か異常が発生しているから通知する」といった感じになる。通知しないにしても、ERRORやWARNINGをカウントして監視用ミドルに残しておいて、状態の確認を行えたりする。

ちなみに、監視のタイミングは常時行われてる物ではなく、大抵は5分に1回のタイミングで監視のタスクが実行される。つまり、定点観測される時間以内に発生した事はある意味ブラックボックスになってしまうため、ログ監視を行うことでそれらを補完する事が出来る。例えば、死活・リソース・プロセス監視を行っていても、その5分以内にWeb(Apache)が再起動したとしても検知は出来ない。ただしログを見ると、”caught SIGTERM, shutting down”といったように再起動が行われたイベントが書いてあると、再起動が行われた!!と通知を行う事が出来る。

 

5.サービス・アプリ(optional)
1-4は基本的な監視でシステムが何であっても大抵は同じような感じだと思う。ただ、これは「サービス・アプリがどういった状態で稼働しているのが正しいのか?」という、サービス・アプリが正常に動作している事を確認する事になる。
例えば、何らかの認証APIを利用しているアプリケーションの場合、上記の監視1-4が正常に稼働していてもアプリケーションに不具合が発生して認証出来ない事が発生するかも知れない。その時、認証APIが正常に動作しているか監視を行うことで、問題点の早期発見につながる。

この監視が付随的だと思っているのは、サービス・アプリの独自の正確が出ることで、監視側もそのサービス・アプリに特化した監視用スクリプトを用意する事になる。前述の認証APIのように、あるプロトコルや引数を渡さないと確認出来ないような物は、その監視のために特別な物を用意する事になって…そう、つまり面倒の一言に尽きる。ただ、ちゃんとしている所は、「サービス・アプリとしてこの部分の動作確認が取れていないとヤバいだろう」という部分については監視を行っていたりする。

 

他にもセキュリティ監視(iptablesで怪しいのは通知&取っておいたり、WebだとWAFを仕掛けておくとか)、ミドルレベルならメールキューの数を監視したり色々他にもある。あと冒頭に書いたように、色んな監視用ミドルがある訳で、最初に用意しておけば使い回しも出来るしとっても便利だと思う。ただツールを使うにしても、デフォルトの設定や書いてある通りに行うのではなく、何で?どういう監視が必要なのか?というのを知っておいた方が良い。
監視していないシステムは止まっているのと一緒だと思うけど、何でもかんでも監視すれば良いという訳でも無いと思うし、監視を運用するコスト・問題が発生した時の対応といった別の課題もある。ただ、最低限の監視(1-4のどれか)を行っておいた方が良いのは間違い無いと思うけど。

ピンポン玉でディフューザー

ピンポン玉にLEDを仕込んでちょっと何か作ろうと思っている前段で、ちょっとまとめ。プロジェクタで投影するのとはちょっと違う見栄えになる。それにしても色々あって面白い。

how to float a ping pong ball in the air
LEDを仕込んだ玉を風で浮かせている。単純だけど良い感じ。

– 25,000 Ping-Pong balls for a Tiny Pied-à-Terre by Snarkitecture
部屋中をピンポン玉で埋め尽くすというもの。光りはしないようだ。

– The Much Larger Board Of Many Ping-Pong Balls
音楽に合わせてパターンが変わるもの。

ping pong ball projection
プールに大量のピンポン玉を浮かばせて上から投影。これは結構前に見たことが。

Quad Cubatron
平面に配置するのではなく、x-y-zで配置。LED QUBEみたいになる。

カーネギーメロンのクラス資料
手でふれでバラバラして遊ぶもの。サーボでも仕込んでぐるぐる動かしてみたら面白いかも。

Bacardi Breezer Bottle Wall
ピンポン玉ではなく、ガラスのボトルを使ったもの。

Water Light Graffiti by Antonin Fourneau, created in the Digitalarti Artlab
水をかけると光るLED Wall

The Man with No Shadow
ピンポン玉では無いけど、LEDを仕込んだ玉を人形にして光らせたら…と思って調べてみたら、違う方法で既に。LED ping pongでやってみるとまた違う感じになるかな…

LED Wall物と似ていて、更にプロジェクターで投影したりとかも。あと、ちょっと違う感じで、こういうのも面白い。トラッキングして表示を変えるのとか。
LED wall and Kinect join forces
Cubepix, Kinetic Projection Mapping On A Moving Wall of Cubes [Arduino + OF + Kinect]

あとはInfinity LEDを大量に使った物とか、LED Wallものは調べてみると既に製品としてある物が割と多いような気がする。
LED Wall Light, LED Tunnel Light with 3D Effect

8X8dots Led wall curtain & dance floor

OpenNI2 DS325 and Android ODROID 4.4.2 memo

Install Android 4.4.2 to ODROID U3 Community Edition($65), let’s try to use 3D point cloud with Depth Sense DS325. All environment is here.

ODROID U-3 Community Edition
OS : Android 4.4.2
Camera : DepthSense DS325
Software: OpenNI2 for DS325, openFrameworks 8.1

Connection each others.

Application running result.

Android with OpenNI2 and DS325 can easy to use. In this case I use ODROID as Android, DS325 is verrry small and light weight. Capturing real-world 3D model using mobile devices(like a Google Tango project) is coming here.

OpenNI2 DS325 driver for Android and Arm Linux(Raspberry Pi)

SIProp.org develop OpenNI2 DS325(DepthSense) driver for Android and Arm Linux. There is no choice to use DepthSense 3D ToF sensor camera in embedded device(Arm, Android…), because of PrimeSense Xtion is discontinued and will be hard to get. Here is “How to build OpenNI2 DS325 driver for Android and Arm Linux Raspberry Pi”.

1.  Android Build

# Build OpenNI2 DS325 Driver for Android
wget http://dl.google.com/android/ndk/android-ndk-r8e-darwin-x86_64.tar.bz2
tar -jxvf android-ndk-r8e-darwin-x86_64.tar.bz2
cd android-ndk-r8e
export NDK_ROOT=$PWD
export PATH=$PATH:$PWD
cd ..
git clone https://github.com/SIProp/openni2ds325.git
cd openni2ds325/Packaging/
python ReleaseVersion.py android

# copy all shared libraries and ini file to Android
cd OpenNI-android-2.2
./adb push libusb.so /system/lib/
./adb push libOpenNI2.so /system/lib/
./adb push libOniFile.so /system/lib/
./adb push libDS325.so /system/lib/
./adb push libPSLink.so /system/lib/
./adb push libPS1080.so /system/lib/
./adb push OpenNI.ini /system/lib/
./adb push PS1080.ini /system/lib/
./adb push DS325.ini /system/lib/
./adb push SimpleRead /system/lib/

# Sample Application Build
cd openni2ds325/Samples/DS325Sample/jni/
ndk-build

# import DS325Sample Project on Eclipse and Run.

 

2. ARM Raspberry Pi

sudo apt-get update
sudo apt-get install g++ python libusb-1.0-0-dev freeglut3-dev \
                      doxygen graphviz openjdk-6-jdk libudev-dev
git clone https://github.com/SIProp/openni2ds325.git

# edit "ThirdParty/PSCommon/BuildSystem/Platform.Arm" file
------------------------------------------------
# change CFLAGS option.
CFLAGS += -march=armv7-a -mtune=cortex-a9 -mfpu=neon -mfloat-abi=softfp #-mcpu=cortex-a8
to
CFLAGS += -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard

# disable NEON option
DEFINES += XN_NEON
to
#DEFINES += XN_NEON
------------------------------------------------

# build OpenNI2
cd openni2ds325/Packaging
python ReleaseVersion.py Arm

# Run and check DS325
cd OpenNI-Linux-Arm-2.2/Samples/Bin
./SimpleRead

prime number in triangle

πで綺麗に絵を書いているのを見て、素数をちょっと使ってみようと、ちょっとばかし時間があったからやってみた。ウラムの螺旋とかサックスの螺旋とか以外にも色々あるけど、ここでは三角形の配列を使ってみる。

line:1                 1
line:2               2  3
line:3            4   5   6
line:4       7    8    9   10
line:5   11 12 13 14 15
………

こんな感じの3角形の配列を用意して、素数の所だけ塗りつぶす。これはウラムの螺旋とかと一緒の感じで。

line:1                   1
line:2                2   3
line:3            4    5   6
line:4         7    8   9   10
line:5     11 12 13 14 15
………

こんな感じで素数の所だけ塗りつぶしていく。他はグレーにしているけど、素数じゃない所は何も塗りつぶさない。あとline:1は1だから無しで。プログラム的な流れは、一番左の1,2,4,7,11,16…は (n*n -n +2)/2だから、行番号(n)を上げていってその横幅(行数と同じ個数)にある素数を特定したら、その箇所を塗りつぶす。

結果はこんな感じ。oFでサクッと描いた。

生成される時の動画はこんな感じ。

あんまり規則性が見えなかったかも…スケールを変えると微妙に縦や斜めに線が見え始めるけど、うーん…って感じ。微妙に濃淡があるけど、これはキャプチャの限界で、スケールを変えるとちゃんと全部同じ濃さ&サイズになる。色をつけてみたら何か感触かわるかなぁ。まぁ、けど、何か面白かった。

一応環境としてはMacbook Air 11-ich, Mid 2011, Core i5 1.6GHz, Mem : 4Gbyte, OS X 10.8.5, openFrameworks 8.1を使って、22,685個の素数をポイントしている。

RabbitMQ with AMQP PHP

RabbitMQ AMQP-PHP library build on Ubuntu 13.10 memo.

# environment
# cat /etc/lsb-release
# DISTRIB_ID=Ubuntu
# DISTRIB_RELEASE=13.10
# DISTRIB_CODENAME=saucy
# DISTRIB_DESCRIPTION=”Ubuntu 13.10″

# build rabbitmq-c
git clone https://github.com/alanxz/rabbitmq-c.git
cd rabbitmq-c/
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/rabbitmq-c/ ..
cmake –build .
make install

# build AMQP PHP
wget http://pecl.php.net/get/amqp-1.4.0.tgz
tar -zxvf amqp-1.4.0.tgz
cd amqp-1.4.0/
phpize
./configure –with-librabbitmq-dir=/usr/local/rabbitmq-c –with-amqp

# modify Makefile
AMQP_SHARED_LIBADD = -Wl,-rpath,/usr/local/rabbitmq-c/lib -L/usr/local/rabbitmq-c/lib -lrabbitmq /usr/local/rabbitmq-c/lib/x86_64-linux-gnu/
to
AMQP_SHARED_LIBADD = -Wl,-rpath,/usr/local/rabbitmq-c/lib -L/usr/local/rabbitmq-c/lib -lrabbitmq -L/usr/local/rabbitmq-c/lib/x86_64-linux-gnu/

make
make install
cat <<EOF > /etc/ld.so.conf.d/rabbitmq-c.conf
/usr/local/rabbitmq-c/lib/x86_64-linux-gnu/
EOF
ldconfig

# add apache, php.ini
cat <<EOF > /etc/php5/mods-available/amqp.ini
extension=amqp.so
EOF
ln -s /etc/php5/mods-available/amqp.ini /etc/php5/apache2/conf.d/20-amqp.ini
service apache2 restart

sender.php

<?php
$cnn = new AMQPConnection();
$cnn->connect();
$ch = new AMQPChannel($cnn);

// Declare a new exchange
$ex = new AMQPExchange($ch);
$ex->setName('exchange-test');
$ex->setType(AMQP_EX_TYPE_FANOUT);
$ex->declareExchange();

// Create a new queue
$q = new AMQPQueue($ch);
$q->setName('queue-test');
$q->setFlags(AMQP_NOPARAM);
$q->declareQueue();
$q->bind($ex->getName());

for ($i = 0; $i < 10000; $i++) {
    $data = array('id' => $i, 'time' => time());
    $ex->publish(serialize($data));
}
$cnn->disconnect();

?>

reciever.php

<?php

ini_set('amqp.auto_ack', false);

$cnn = new AMQPConnection();
$cnn->connect();
$ch = new AMQPChannel($cnn);
$ch->setPrefetchCount(1);

// Declare a new exchange
$ex = new AMQPExchange($ch);
$ex->setName('exchange-test');
$ex->setType(AMQP_EX_TYPE_FANOUT);
$ex->declareExchange();

// Create a new queue
$q = new AMQPQueue($ch);
$q->setName('queue-test');
$q->setFlags(AMQP_NOPARAM);
$q->declareQueue();
$q->bind($ex->getName());

$q->consume(
    function (AMQPEnvelope $msg, AMQPQueue $queue) use ($ex) {
        echo $msg->getBody(), PHP_EOL;
        return $queue->ack($msg->getDeliveryTag());
});
?>

rabbitmqctl list_queues
Listing queues …
queue-test 10764
…done.