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

セフィロト

現在Ultra@青山スパイラルで展示中です。11/03まで展示しています。

pic1

左から、ドイツで大活躍中の加藤さん、自分、知念さんの作品です。お二人ともとってもカッコいい!!素敵な作品です。自分のはお花が2つに、空の籠のセットでタイトルはセフィトロとしています。いわゆる生命の樹のセフィロトという名前は、このお花に仕込んでいる光(LED)が自分の心拍をサンプリングした脈動に合わせて光っているという所から取っています。

 

自分のは構成的にはこんな感じです。

静電容量が何箇所かお花に付けられていて、2個あるのは一方が男性面・女性面で手で触れるお花(それぞれのお花に何箇所か仕掛けてある葉っぱの所とか)の拠って異なる反応で仕掛けられているLEDが光ります。そして籠はスピーカの役割を果たしていて、お花の方に触るとそこから男性・女性の声・サンプリングした音が鳴ったりLEDが光る仕掛けになっています。
そして、籠は上に向かって赤外線センサを仕込んでいて、籠の上に手をかざしたりすると、お花の方に仕掛けているLEDがふわぁっと光る感じですね。
あとお花の方は何もしなくても何箇所か仕掛けてある光(LED)が、サンプリングした自分の心拍の脈動に合わせて光らせています。そこからセフィロトって名前を付けた感じ。

他に展示してある中で、これは良いなーと思ったのを。

オランダのZEDZ氏の作品。ZEDD氏のHPもめっちゃカッコいい。

野村さんの作品。太陽系の惑星間の中心点をプロジェクターで動的に作図していて、こんなにも見事になるものか!!と感動した。他にも素数や数列を使った作品とかの規則性が凄くカッコいい。

Minimalist

Minimalistに捧ぐ自分の手持ちのデバイス達

大きいもの順で並べてみた。これ全部展示とか何かで使ってねーべー?とか思うかも知れないけど、何気に展示とかで使ってるですね。他にも何個かあるけど、小さいサイズの物で。この子達はその都度、検証したりモノに取り入れたり。Edisonをゲットしてひとつ増えた事もあって、左から1つづつ紹介を…

RKM 802 IV

KDDIさんがOpen Web Boardとかって発表していた物とメッチャ似てるというか、一緒じゃないかしら…というかRockchipで一緒ですよね。。。Androidを載せてXtionとOpenNI、openFrameworksを動かしてPoint Cloudの展示で使った。

ODROID-U3

この子は名作だと思っている。$65で超ハイスペック!!(備品を色々買うと$100位になるけど)
ARMの評価ボードで最初っからヒートシンクが着いているという、「熱出しまくるぜ!!」と主張しているけど、実際にはそんなに熱くならない気がする。LinuxもAnroidもどっちも動く。どちらでもXtion, DepthSense、OpenNIとopenFrameworksを動かして展示で使った。

Arduino UNO

言わずもがな…って感じもするけど、色々と使われてますよね。

Intel Edison

ここから1段サイズが小さくなる。現在、評価中のEdison。スペックというか機能がモリモリ凄すぎ。実際はブレイクアウトボードと一緒に使う事になる。アンテナは手持ちの物を付けた。普通にLinuxを使っているのと変わらない感じ。このサイズで802.11 a/b/g/n, Bluetoothも使えてCPUはDual Core Quark 400MHzという凄さ。日本で買えるとなったと分かった時、スイッチさんとこで即予約したった。自分はMini Breakout Kitと一緒にゲット。

LightBlue Bean

Bluetoothが使えてArduino IDEで開発が出来る端末。ボタン電池で結構長い間動く素敵な感じ。このサイズでデフォルトで加速度センサが付いていて温度も測定できる。元のサイズはもう少し大きいけど、照度センサとマイクモジュールを付けてリモートから使える環境センサにしてみた。

Arduino Pro Mini

割と使う頻度が高い。このサイズで普通のArduinoとして使える。自分的にはUNOよりこっちの方が便利な感じ。よく展示向けのモノの裏方で使ったりする。

Spark Core

WiFiにつなげてWeb上でソースをビルドすると端末に流し込める(IDEをインストールしなくても、Web上でOK)。802.11 n(b/g)が使える。面白いんだけど、何というかあと一歩…って感じがして遊びで使っているけど、何かで使ったことはまだ無い。ただ、Spark Core用のMQTTライブラリを作ったりした。宅内に設置しといて、外からプッシュとかで遊べるかなーって。

8pino

サイズが驚異的に小さくなる。このサイズ…マヂでヤバイ。ピンヘッダは付けなくて使える。値段も$8というお手ごろ感がたっぷりで、Micro USBに挿して使えることからサクッとArduinoの入門としても良い感じ。Arduino IDEも使えるしかなり楽しめると思われ。

8pinoを使ってみる

品モノラボに行ってきた。何気に自分、行くのが2回目という(いつも行こうと思ってはいるですが…)。いやー、刺激的っすねー。Web系でもあまり聞かないようなブッ飛び系のアイディアの話を聞いたりして、率直にモノ系以外の人でも参加してみたらメッチャ面白いと思う。

そして…8/8とくれば、8pinoにドキドキしていたら、田中さんよりジャンケン大会で限定8個の争奪戦と!!オイラ、ジャンケン大会とかめっちゃ弱いというか自信のひとかけらも無かったけど、勝っちゃいました。この場で勝負運を発動できたようで、ホントまぢで嬉しいぃぃぃ。

その場でまずは開封の儀を。まずは包装はこんな感じでカッコイイ。

中身をあけると…梱包物一覧は。

ちっちぇぇぇぇー!!早速、その場でマイクロUSBの端子をお借りしてチカチカーっと!!

この小ささに反比例して、むっちゃテンション上がりまくり。深爪な自分の指先ほどの大きさ。
Arduino IDEでの使い方は8pinoにアップされている通りで、自分はMacOS/Windows7のどちらでもArduino IDEからソースを焼け込めた。Windows7の方は追加でドライバを入れれば問題無し。MacはTrinketのIDEを入れて即使える。以下、Macでのやり方は…

Arduino IDEをサイトからダウンロードしたら書いてある通りに、まずはマイコンボードで「Trinket 8MHz」を選択。

次に「USBtinyISP」を選択

これで完了。ちなみに、Arduino IDEから書き込みの時、”Could not find USBtiny device (0x1781/0xc9f)”なんて書き込み失敗が出ると思うけど、8pinoとUSBの抜き差しがリセットという事は…そう、8pinoのUSBを抜き差しした10秒間が書き込みのとき。抜き差しした時にIDEから書き込みをポチっとすれば、すんなり書き込み完了する。

そして、8pinoをマイクロUSBにつけてLチカのコードをサクッと書き込んで終了!!LEDのピンを挟む感じで付けると特にハンダも使わないで動確できる。こんな感じでLEDのピンでキュッと挟んで。

チカチカー!!

そしてAgICとコラボってみる

薄っすーぃ!!ペラッペラで紙と一体化してるよw
サクッと折り紙にして仕込んじゃえるね。

AgICのは、最初の8個という事で、いつもの勢いでしょっぱなからハンダ付けするのは忍び無さ過ぎる…と思ってAgICを使って紙に書くことにした。ATTINY85と一緒な感じでPWMもバッチリー。ちょぴーっとだけ、ハンダ付けしちゃおっかなー。ピンヘッダを付けてブレットボードに刺せるのは合わせてみたらバッチリ出来るのを確認したし、あとはハンダ付けしちゃおーかしらーってオイラの心ひとつ。折角AgIC使って載せられたから、紙の上にセンサー載せちゃおーかしら。指先に8pinoを載せて、何かセンサー反応させて指先ピカピカー!!とか。

Arduino IDEでプログラムをサクッと書いて、この小ささに収めて動かせるというのは、かなり可能性を感じる。Makerやモノ寄りな人だけじゃなく、アートや音系、クリエイターの方でもArduinoを使った作品はよく見るし、この極小サイズは考えること&想像力(妄想力)が膨らみまくると思う。

追記) ピンヘッダの取り付けと、GP2Y0A21YK(赤外線センサ)を一緒に使ってみた内容はこちら。(続)8pinoを使ってみる

DockerでElasticsearchとKuromoji

何となくelasticsearchをDockerで動かしたくなって探してみたら、

docker search elasticsearch

スゲーあるのね。ただKuromojiを使えそーな物がちょっとなくって、ググって調べてみたけど、ちょい前のだったり動かなかったりして…って事で、dockerfile/elasticsearch をforkしてサクっと作った。elasticsearchは1.3.0、kuomoji 2.3.0とHQが入る。今時点で、最新のelasticsearch(1.3.0)と対応するkuromojiで(elasticsearchのバージョンが変わると対応するkuromojiのバージョンも変わったりする)。こんな感じでめちゃ簡単。ポートの9200, 9300は通しておけば、以下コピペで完了。

# make elasticsearch container
git clone https://github.com/hirotakaster/elasticsearch
cd elasticsearch
docker  build -t hirotakaster/elasticsearch .
docker  run -d -p 9200:9200 -p 9300:9300 hirotakaster/elasticsearch

# search test
curl -XPUT 'http://localhost:9200/kuro_test/' -d'
  {
      "index":{
          "analysis":{
              "tokenizer" : {
                  "kuromoji" : {
                     "type" : "kuromoji_tokenizer"
                  }
              },
              "analyzer" : {
                  "analyzer" : {
                      "type" : "custom",
                      "tokenizer" : "kuromoji"
                  }
              }
          }
      }
  }'

# {"acknowledged":true}

curl -XPOST 'http://localhost:9200/kuro_test/_analyze?analyzer=analyzer&petty' -d '今日はラーメンだ'
{"tokens":[{"token":"今日","start_offset":0,"end_offset":2,"type":"word","position":1},{"token":"は","start_offset":2,"end_offset":3,"type":"word","position":2},{"token":"ラーメン","start_offset":3,"end_offset":7,"type":"word","position":3},{"token":"だ","start_offset":7,"end_offset":8,"type":"word","position":4}]}

おわり。HQへは、http://localhost:9200/_plugin/HQ/ でアクセス。

facetime packet capture

facetimeはSIPを使っている。そしてオマケにSTUNでNAT超えもするという素敵機能がデフォルトで発動している。デフォルトでMac/iPhone間で通話がサクットできる。簡単にfacetimeのパケットを見てみる。

■ 環境
Macbook Pro(LAN内) iPhone5(KDDI)
ここでMacbook Proの方でWireSharkを使ってキャプチャをする。
ちなみに、MacのFacetimeのバージョンは3.0で、iOS 7.1.2。

■ 結果.1 STUNのパケット
キャプチャをしたらWireSharkのFilterの所にstunと入れるとこんな感じで見れる。

Binding Requestとか良い感じに綺麗に見れますね。184.50.86.131はAkamaiのアドレスですねぇ。まぁ、ただの穴あけ機だから何でも良いんだろうけど。

■ 結果.2 SIPのパケット
STUNでMac-iPhone間が直接UDPで通信可能になったら、次はSIPですね。同じくFilterの所にsipと入れると中身がごっそり見れる。暗号化は一つもしていない男前っぷりというか、Appleにしては思い切ったことしてますね。

黒いところはMac側のGlobal IPが入っているので塗りつぶしています。INVITE/100 Trying/180 Ringing/200 OK/ACK/BYE/200 OKといった感じで基本的なSIPのプロトコルの流れが見れますね。106.128.94.223というIPはKDDIのLTEの所にあるnatterのIPですね。そこの16402に対してUDPのパケットを投げると、直接通信が出来るというUDP Holepunchingの仕組み。

■ 結果.3 SDPを見る
INVITEのbody部にはSDPが入っているけど、そのままだと見れない。さっきのINVITEのヘッダを見てみると、”e: deflate” と書いてある…そう、SDP部分は圧縮されている。そこで、次のようにしてSDP部分は見る。

まず最初にSDP部分のデータをローカルか何かに保存する。こんな感じで。

とりあえずここではsdp.datとして保存した。次にPHPのスクリプト(別にPHPじゃなくてもuncompressできれば何でも)で保存したデータをuncompressする。こんな感じで。

$filename = "./sdp.dat";
$handle = fopen($filename, "rb");
$contents = fread($handle, filesize($filename));
fclose($handle);
$uncompressed = gzuncompress($contents);
echo $uncompressed;

すると、次のようなSDPの中身が見れると思う。

v=0
o=GKVoiceChatService 0 0 IN IP4 210.172.128.230
s=niisato
c=IN IP4 [IPアドレス]
b=AS:2000
t=0 0
a=FLS;VRA:0;MVRA:0;RVRA1:1;RVRA2:1;AS:2;MS:-1;LF:-1;LTR;CABAC;CR:3;PR;AR:8/5,2/3;XR;
a=DMBR
a=CAP
m=audio 37338 RTP/AVP 104 105 106 9 0 124 122 121
a=rtcp:37338
a=fmtp:AAC SamplesPerBlock 480
a=rtpID:3398691976
a=au:67072
a=fmtp:104 sbr;block 480
a=fmtp:105 sbr;block 480
a=fmtp:106 sec;sbr;block 480
a=fmtp:122 sec
a=fmtp:121 sec
m=video 37338 RTP/AVP 126
a=rtcp:37338
a=rtpID:1321803278
a=rtpmap:126 X-H264/90000
a=fmtp:126 imagesize 0 rules 15:320:240:320:240:15
a=imageattr:126 send [x=320,y=240,fps=30] [x=480,y=368,fps=30] [x=640,y=480,fps=30] [x=1280,y=720,fps=30] recv [x=320,y=240,fps=30] [x=480,y=368,fps=30] [x=640,y=480,fps=30] [x=1280,y=720,fps=30]

セッション名(s=niisato)の所にオイラのMac上のアカウント名が見れちゃってるんだけど、まぁ別にこれくらいなら良いか…わりとイヤな感じがするけど…あと、IPアドレスの所はMacが居るLANのGlobal側IPが入ってくる。
ここでサクッと分かるのは、RTCPのポートは37338、オーディオ(m=audio)にはPCMU、G.722、AACとか。ビデオはH264ですね。

■ 結果.4 RTPを見る。
RTPはSIPでセッションが確立した後に利用されるプロトコルで、実際に話していたり、ビデオ通話しているデータが流れている。これも特に暗号化されていないで丸っと見れるので、確認するにはとっても便利。

まず最初にセッション確立後にRTPのポートに流れいるUDPのパケットを調べる。

次に、このUDPのパケットをRTPにして見る。Decode Asを選択して…

RTPをポチっと。

すると一覧で見れるようになる。

Appleの所に書いてあった感じだとSRTPでエンドtoエンドで暗号化されるとかってあったと思うけど、メディアデータの所は単純にこのパケットから再生しても再生できない。つまり、メディアの所は暗号化(AES-256)の所っすかね。パケットを詳しくは見ていないから分かんないけど、STUNでend-to-endで接続の時か、他の所で何かTCPでサーバと話している所もあったりして、まぁどっかで鍵は渡してるんでしょうね。

メディア暗号化の所以外は、STUN-SIP/SDP-RTPの部分は確認できるんで(平文だし)、興味があったら見てみても良いと思われ。

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.

Creative Senze3D – Intel Interactive Gesture Camera Teardown

Intel RealSense SDK camera – Creative Senze3D Gesture Camera Teardown, and compare to DepthSense DS325.

1. open the attachment, take the screw.

2. open the rubber stopper, take the screws.

3. open the back cover.

4. Unscrew the hexagon bolt, open the 1st board. This board is printed “SOFTKINETIC KOREA DS325V2_M”.

5. Take the screws and hexagon bolt from next board.

6. DepthSense DS325 and Creative Senze3D.

both boards is printed “SOFTKINETIC KOREA DS325V2_M”.

Creative Senze3D all parts.

openFrameworks 8.1 and OpenNI 2.2 on Android tutorial

This tutorial is “How to use oF 8.1 with OpenNI 2.2 on Android”, using Xtion. If want to use Kinect, use OpenNI 1.x and Sensor Kinect driver. And my build envrionment, I use Mac OS 10.8.5, Android 4.2.2 (device is MK 802 IV HDMI dongle type Android, root user needed) on this tutorial. May be other Android devices OpenNI 2.2 works well(OpenNI ran on Nexus7 in my test).

1. Built OpenNI 2.2
# Download Android NDK
cd $HOME
mkdir work
cd work
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

# Download OpenNI 2.2 from git
cd $HOME/work
git clone https://github.com/OpenNI/OpenNI2.git
cd OpenNI2
# change PS1080.ini file path
vi ./Source/Drivers/PS1080/Sensor/XnSensor.cpp
#define XN_GLOBAL_CONFIG_FILE_NAME “PS1080.ini”
to
#define XN_GLOBAL_CONFIG_FILE_NAME “/system/lib/PS1080.ini”

# change OpenNI.ini file path
vi ./Source/Core/OniContext.cpp
static const char* ONI_CONFIGURATION_FILE = “OpenNI.ini”;
to
static const char* ONI_CONFIGURATION_FILE = “/system/lib/OpenNI.ini”;

static const char* ONI_DEFAULT_DRIVERS_REPOSITORY = “OpenNI2” XN_FILE_DIR_SEP “Drivers”;
to
static const char* ONI_DEFAULT_DRIVERS_REPOSITORY = “/system/lib/”;

# build OpenNI 2.2
cd Packaging
python ReleaseVersion.py android
cd Final
tar -xvf OpenNI-android-2.2.tar
cd OpenNI-android-2.2
ls
EventBasedRead OpenNI.ini SimpleRead libOpenNI2.so libPSLink.so
MultipleStreamRead PS1080.ini libOniFile.so libPS1080.so libusb.so

# copy shard library and ini file to Android
adb push OpenNI.ini /system/lib/
adb push PS1080.ini /system/lib/
adb push libOpenNI2.so /system/lib/
adb push libPS1080.so /system/lib/
adb push libusb.so /system/lib/
adb push libOniFile.so /system/lib/
adb push libPSLink.so /system/lib/
adb push SimpleRead /system/lib/

# check OpenNI running.
adb shell
cd /system/lib/
SimpleRead
./SimpleRead
[00000000] 585
[00033369] 585
[00066738] 584
[00100107] 584
[00133477] 584
[00166846] 584
[00200215] 584
[00233584] 583
[00266954] 583
……

2. oepnFrameworks 8.1 for Android
Download openFrameworks 8.1 for Android from official site, of course Android SDK, Eclipse, JDK is needed. openFrameworks for Android tutorials is here.

# download Android NDK
cd $HOME/work
wget http://dl.google.com/android/ndk/android-ndk-r9d-darwin-x86_64.tar.bz2
tar -jxvf android-ndk-r8d-darwin-x86_64.tar.bz2

# set paths.make. following is my example.
vi libs/openFrameworksCompiled/project/android/paths.make
SDK_ROOT=$HOME/work/android-sdk-macosx
NDK_ROOT=$HOME/work/android-sdk-macosx/android-ndk-r9d

# set OpenNI include files, shard library file oF make file.
“libs/openFrameworksCompiled/project/android/config.android.default.mk” changes diff is following.

36c36
< ABIS_TO_COMPILE_RELEASE = armv5 armv7 neon — > ABIS_TO_COMPILE_RELEASE = armv5 armv7 neon x86
193c193
< PLATFORM_LDFLAGS += –sysroot=$(SYSROOT) -nostdlib -L”$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/$(GCC_VERSION)/libs/$(ABI_PATH)” -L$HOME/work/OpenNI2/Packaging/Final/OpenNI-android-2.2 — > PLATFORM_LDFLAGS += –sysroot=$(SYSROOT) -nostdlib -L”$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/$(GCC_VERSION)/libs/$(ABI_PATH)”
311d310
< PLATFORM_HEADER_SEARCH_PATHS += “$HOME/work/OpenNI2/Include”
343,345d341
< PLATFORM_LIBRARIES += OpenNI2
< PLATFORM_LIBRARIES += OniFile
< PLATFORM_LIBRARIES += PS1080

3. Sample android application
Eclipse project androidOpenNIExample.tar.gz.
APK androidOpenNIExample.apk

MK 802 IV is HDMI dongle type android device(just like a Chromecast by google), easy to use with LED TV. About 60,000 point cloud is drawing in 30fps in this application.

Point Cloud Library on Mac OS X Mavericks

PCLをMacで使おうとしたら、本家の手順だとハマりまくったから、ちょっと備忘録として。
ソースからインストールします。

# OpenNI
# OpenNIは1.x系だけど、brewで/usr/loca/以下に展開されるから、
# 2.x系と共存できるし入れといても良いんじゃないかなと
# thanks totakke formula!!
brew tap homebrew/science
brew tap totakke/openni

# install
brew install openni # 1.5.7.10
brew install sensor
brew install sensor-kinect
brew install nite # 1.5.2.21

# symbolic link
cd /usr/local/include
ln -s ni openni

# pcl
brew install cmake
brew install boost
brew install eigen
brew install flann
brew install vtk5 –with-qt

# 以下、PCLのビルドとか
cd $HOME
git clone https://github.com/PointCloudLibrary/pcl
cd pcl
mkdir build
cd build
cmake ..
make