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/ でアクセス。

FlyngBallで遊んでみる

FlyngBallがどういう物かと言うと…

こんな感じで上下に飛ぶ物。羽が4枚ついていて、下部にある赤外線センサで地面(もしくは手とかかざして)が近づいたら、上がって行くシンプルなもの。上がるといっても3m位な感じ。普通にAmazonで買えます

IMG_3464

白色LEDが内蔵されているから、こやつを大量に用意して夜にババーっと飛ばしたら、光りながら空中を動いて面白いかなと思った。たぶん綺麗な気はするけど、あきりたりな感じ&数を揃えただけーって感じもするし…まぁこの子で楽しんでみる事に。
中身は上図のように、リチウムポリマーとモーター、基板が付いている。

  

飛ばしている所を撮ってもらいました。中身をばらすとこんな感じ。

一番左が赤外線、左から2番目がON/OFFスイッチ、真ん中が充電用、一番右がリモコン受信部って感じ。まぁ普通に遊べるんだけど、ぶっちゃけすぐ何かがおかしくなります。自分が壊したパターンは…

 

・普通にまっすぐ上下に飛ぶ事は無いです。ちょっとバランスが崩れると、左右に暴れて飛んだり、墜落〜床に落ちて暴れまくります。自分は間違って踏んでしまい、あっさりシャフトが折れ曲がって修復不能になってしまった。

・天井が低いと、思いっきり天井にぶつかりまくります。ある程度高い天井でも、誤って手を赤外線センサの下にいれようものなら、勢い良く天井にぶつかって墜落します。墜落の衝撃で何かおかしくなってしまう。多分、この墜落パターンが一番多い気がする。

 

シャフトが折れて壊れるのは修復不能っす。床で暴れている時に間違って踏みつけorキックとかしないように…どうせ壊すと思って2個買ったけど、誤って踏みつけ&シャフトを曲げた時はさすが軽く涙目でした。んで、次の墜落パターンはかなり多い。もうボコボコ墜落しまくるwww
そして墜落しまくると、まず玉の内部の何かおかしい事になるか、壊れます。自分で玉を分解して治せないと「買って何度か飛ばしているうちに、動かなくなって終了」というパターンになると思われ。

このピンポン玉みたいな物を分解するには、超精密ドライバーが必要不可欠です。ダイソーで100円とかで売ってると思うので。この子ね。

墜落その1。ギアが外れる。

この上の方の羽を回しているシャフトは、下のシャフトの中を通している構造になっている。この上の羽につながっているシャフトのギアは、何かに衝突した衝撃でよく取れる。何度かぶつけるとすぐギアが上図のように外れてしまう。という事で、羽が動かなくなったら玉をばらしてギアを下のように取り付け直すと復活します。

墜落その2。ポキっと折れる。

そう、この左側(リポの方)のネジのソケットの所に本当は右部のように支えが入る。この部分が真ん中近くからポキっと折れる。これが折れると飛んでいる最中に中でバランスが取れなくなって、恐ろしい動きをする。例えば赤外線センサ部分が玉の中に入り込んで、延々と飛び続けたり、バランスがそもそも取れなくて床で暴れまくる。
ポキっと折れた部分は玉の中に入っていると思うので、折れた部分をつなぎ治せば修復完了。

何にしても…普通に飛ばして楽しもうとすると、すぐ何かおかしくなると思われです。すぐ動かなくなってコイツやべぇじゃん!!って訳でもなくって、大して複雑な感じでも無いし中を開けて見れば治せると思われ。

How to build PCL for Android memo

PCL(Point Cloud Library) can use on Android, but don’t supply Android binary. So let’s build PCL using Android NDK on MacOS 10.9.4!! verrrry easy to build.

wget http://dl.google.com/android/ndk/android-ndk-r8c-darwin-x86.tar.bz2
tar -jxvf android-ndk-r8c-darwin-x86.tar.bz2
cd android-ndk-r8c
export ANDROID_NDK=$PWD
cd ~work
git clone https://github.com/hirotakaster/pcl-superbuild.git
cd pcl-superbuild
mkdir build
cd build
cmake ../
make -j4 # j4 is prallel build option

All build finish, you will find following include and library.
pcl-superbuild/build/CMakeExternals/Install/boost-android/
pcl-superbuild/build/CMakeExternals/Install/flann-android/
pcl-superbuild/build/CMakeExternals/Install/pcl-android/

Next build android application(like a Google Project tango) with PCL and NDK library.

VoIP Packet Capture

全てUDP(RTP)を利用している(LINEは暗号化されて不明だけど、過去記事からはRTPという事で…UDPしか流れてないし)、通話時のパケットのキャプチャ結果。
縦軸はパケット数、バイト数の2グラフ。クライアントはiPhone 5 LTEで、facetime/LINE/Skypeクライアントの所でキャプチャーをした結果。アプリは全て最新版。どう判断するかはあなた次第…ただ、自分的にはグリーンな所が良さげな気がする。

使われているコーデックは、
Facetime : AAC-ELD
LINE : AMR, G.723.1(どちらも、そうらしい位な感じ)
Skype : SiLK(Opus)
ちなみに、どれもメディア部分は暗号化(facetimeとskypeはAES 256、lineは不明)されている感じ。

■ facetime

packets per sec

bandwidth(bytes per sec)

■ LINE

packets per sec

bandwidth(bytes per sec)

■ Skype

packets per sec

bandwidth(bytes per sec)

脳波と迷路と投影物

脳波を何かに使って物を動かしたり、アプリや投影物だったり何か作ってみたいとき、サクット簡単に使える脳波センサーとして次の2個が有名だと思う。

1.Neurosky
脳波センサの先駆けと思われ。猫耳とかこれ使っている。値段と入手性は高いと思われ。1点だけの測定なのでこれで何か分かるか!?といったら微妙な気がする。いまいち集中度・リラックス度が何を基準しているか分からないけど、とりあえず使えるしEEGの値も取れる。

2. Emotive
これもよく見かける。最新のは14点で測定する。見た目も割とオシャレ。NueroSkyeよりは割と色々と出来そうな感じ。自分は持っていない。いつも買おうかどうしようか悩む対象でもある。とりあえず何か値は取れるようだ。

脳波センサで何かしてみる…という事で、脳波センサを使ってロボットを動かしたのがTreasureHuntingRobotだった。

そして、去年、イベント向けでとりあえずサクット作ったもので、脳波センサで迷路を書くという物もやってみた。ソースコードを消してしまっていたようで、またロジックを組んでサクッと作ったから、次はセンサ(Kinect/Xtion/Intelカメラ…etc)で人の顔か体を特定して、取得した脳波値を使って出来る迷路をその人に向かって投影してみようかしら。

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の部分は確認できるんで(平文だし)、興味があったら見てみても良いと思われ。

LightBlue Bean in ping pong ball

LightBlue Bean(Bluetooth Low Energy module,  Temperature sensors, accelerometer, LGB LED, Arduino compatible!!)
Luminosity Sensor: L-31ROPT1C
Sound Sensor: MEMS Microphone Breakout – INMP401(ADMP401) Let’s put light blue into the ping pong ball. This ping pong ball changes the color of the LED as the bean accelerates, the around light/sound/temperature.  And all sensor values can get through the bean’s Bluetooth(like a environmental sensor).

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ケーブル使わないで使えるし全然アリ。