WordPressの高速化

自分がマジメにやる時のWPの高速化方法について。一応、色々と設定とかをして、仮想(お名前.com KVM, MEM 2GB, CPU:3)サーバ1台で 10,000 access/sec くらいは普通に捌けてCPU負荷もほとんど上がらない感じには出来る。つかキャッシュだけどねw
以下、全部やっても1時間もかからずサクっと出来るはず。

– 構成
NginX + WordPress(FastCGI/Apacheどっちでも) + MySQL
まぁ、普通の3層構成っすね。

– 路線
簡単なチューニングとNginXのキャッシュを使う。

– 方法
1. APCを使う
これはオンにすれば即完了。迷う事無し。

2. ngx_pagespeedを入れてみる
多少は変わる。気休めだと思うけど。

3. NginXでgzipを有効にする。
いわゆるコンテンツの圧縮転送。高速化というか、クライアント側にも優しくなれる。

4. NginXのキャッシュを使う
これが本質。普通にNginXのキャッシュを使うと、WP側で記事の更新をしてもキャッシュがクリアされるまで記事が更新されないという残念な事になる。また、WordPressのSuperCacheなる物も結局はAP層(WP)までアクセスが来るので、出来るだけNginX側で全て完結させる。流れ的には以下。

4.1. nginx cache purgeモジュールをNginXに導入する
4.2. Word Press側にNginx Proxy Cache Purge WordPressをプラグインからインストール
4.3. NginX側のconfig, WP側の設定をして終わり。

実際の個別の方法とかはググれば出てくるからそれを参照に。あとwp-adminをキャッシュ対象から外すのも忘れずに。基本的に全部NginX側でキャッシュ、記事やコメントとか変更があったらそのページだけPurgeするという素敵な感じになる。他に色々とプラグインを入れて重いぜ…って事もあんまり関係無くなる。
WordPress側のキャッシュを使う例がよく散見するけど、NginXを使っているならそこで完結させた方が良い。あとどーしても、ApacheでWord Pressを動かしたいぜ!!という理由があれば、Varnishを使うとかってのもあるけど、余計なプロセスは出来れば動かしたく無いからね。

– その他(備忘)
カーネルチューニングとかってのもあるけど、あんまり劇的には変わらんでしょう。他にDBのバッファを増やすとかも、ただ、ふつーのVPSのメモリ(2G-4G)でそれをやった所であんまり何かパッとしないもんね。
他に自分がよくやったりする手法では、PHPのプロセス事前生成& Persistenceを有効にしたり、NginX/Apacheの基本的な設定の確認・見直しとか。PHPってマルチスレッドとかじゃなく、1アクセスに対してforkされた1個のPHPプロセスが対応して動作するから、仮に1アクセスに1秒かかるプログラムの場合、同時100アクセスが瞬間にきたら100個プロセスが無いとあとはキュー待ちというか、backlogに回って順番待ちになる。つまり、FastCGI/Apacheでのプロセス数とAPの秒間の性能、更にCPU数(LoadAvgのキュー)といった感じで可視化される訳で、結局PHPみたいな1リクエストに対して1プロセスで応答する物って、アクセス数を捌くためには最終的にはプロセス数・メモリ・CPU数・サーバ数とリクエスト数の関係がスケールする事になる。ThreadingしたところでCPUリソースは結局消費される訳だけどね。それを避けるために、キャッシュとかを使って軽くするって感じー。

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).