2011年10月31日月曜日

東京node学園祭2011開催記念 node.jsのインストール(CentOS6.0 zsh環境)



東京node学園祭2011は、かつてない刺激的な1日で、
ものを作る人にとってすごくやる気のでる良い一日となったわけで、
その勢いで何か始めたいわけで・・・と思った人は多いはず!

関心があったけど、当日会場にこれなかった人にはぜひニコ動で見てはいかがでしょうか。
特にSocket.IOの作者Guillermo Rauch氏のライブコーディングは必見です。
もちろん他にも、基調講演(@ryahさん)、LiveCoding for beginner(@jxck_さん)やLTなどみどころ満載です。


東京node学園祭2011の資料


  • 基調講演 (@ryahさん)

http://nodejs.org/nodefest2011.pdf


  • LiveCoding for beginner (@jxck_さん)

http://www.slideshare.net/Jxck/nodefest2011live


  • 全部 coffee でスマートフォンアプリを作る (@naoya_itoさん)

http://speakerdeck.com/u/naoya/p/using-only-coffeescript-to-build-an-smartphone-application

【生中継】東京Node学園祭2011~サーバサイドJavaScriptプラットフォーム、Node.js開発者が語る (番組ID:lv68521775)
http://live.nicovideo.jp/watch/lv68521775?ref=ser
※ただし、プレミアム会員のみ2011/11/05(土) 23:59まで視聴可能


早速node.jsのインストールを!


  • nvmを使用したnode.jsのインストール(CentOS6.0 zsh環境)


ここでは、zsh環境+グローバル(root)でのインストール手順となるので、
標準的なインストール方法とは異なります。
標準的なnvmでのnode.jsインストールは次のURLを参照してください。
https://github.com/creationix/nvm/blob/master/README.markdown

▼nvmのインストール用シェルはzshでは動作しないでの一時的にbash切り替え
bash
git clone git://github.com/creationix/nvm.git /usr/local/nvm
source /usr/local/nvm/nvm.sh

▼安定板v0.4.12と最新版v0.5.10をインストールする
nvm install v0.4.12
nvm install v0.5.10

▼bashから抜ける
exit

▼nodeを起動するユーザーの環境変数を追加して保存する。
vi ~/.zshrc
NODE_VERSION='v0.5.10'
PATH=$PATH:/usr/local/nvm/$NODE_VERSION/bin
NODE_PATH=/usr/local/nvm/$NODE_VERSION:/usr/local/nvm/$NODE_VERSION/lib/node_modules
export PATH NODE_PATH

source ~/.zshrc

nvm useを使わないためパス固定で少し不便なので、
バージョン※の切り替えは変数NODE_VERSIONを書き換えで行う。

▼ライブラリのインストール
npm install -g express ejs socket.io cluster connect-memcached mysql mongodb canvas


node.jsのライブラリまとめサイト
http://toolbox.no.de/


※2011/10/30現在の最新版はv0.5.10、安定板はv0.4.12。
年内には安定板のv0.6が出るらしい。


東京node学園祭2011は、クリエイティブな刺激満載のエキサイティングな場であったと思います。
本当は、後夜祭で直接お礼を申し上げるべきなのですが、
諸事情により参加できませんでした。
学園祭 実行委員長の@mesoさんお疲れさまでした。
また、携わった皆様にすべてに感謝したいと思います。
ありがとうございました!




2011年10月26日水曜日

今さら人には聞けないMySQLの話(phpMyAdminでlocalhostのサーバ追加)

phpMyAdminに複数のDBを追加する場合の注意事項(ただし、localhost環境)
とくに、テスト環境など1台のサーバに複数のDBを準備することがよくあります。
そのため、標準のTCPポート番号(3306)以外にして複数登録するわけですが、
次の設定では、phpMyAdminから2つめのlocalhost:3307へ接続できません!
$i++;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['extension'] = 'mysql';
$cfg['Servers'][$i]['AllowNoPassword'] = false;
$i++;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['port'] = '3307';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['extension'] = 'mysql';
$cfg['Servers'][$i]['AllowNoPassword'] = false;
実は、ある意味パラメータには問題ありません。
では、なぜ接続できないかと言うと、
接続はできるのですが、localhost:3307を指定しても
localhost:3306に接続してしまうのです。

原因は、MySQLの仕様でした。
例 次のような構成の場合
/usr/local/mysql1 3306番ポートのインストールディレクトリ
/usr/local/mysql2 3307番ポートのインストールディレクトリ

これはコマンドでも同じことが言えます。
3306番ポートに接続してしまう
/usr/local/mysql1/bin/mysql -h localhost -u [ユーザー名] -P 3307 -p 3307番ポートに接続してしまう /usr/local/mysql2/bin/mysql -h localhost -u [ユーザー名] -P 3306 -p
つまり、コマンドの引数に指定したポート番号は無視され、各my.cnfに設定されたポート番号に接続されます。
3307番に接続したはずが、ポート番号確認すると3306に接続されています。
mysql> SHOW VARIABLES LIKE 'port';
 +---------------+-------+
 | Variable_name | Value |
 +---------------+-------+
 | port          | 3306 |
 +---------------+-------+
 1 row in set (0.00 sec)
これを回避する方法ですが、
実は、ホスト名が「localhost」以外なら問題ありません。
IPアドレスでもサーバのホスト名でもOKです。
つまり、DBとWebサーバが物理的に別になっている環境ならそもそも問題になりません。

回避策 IPアドレスの設定例

$i++;
$cfg['Servers'][$i]['auth_type'] = 'cookie'; $cfg['Servers'][$i]['host'] = '127.0.0.1'; $cfg['Servers'][$i]['connect_type'] = 'tcp'; $cfg['Servers'][$i]['compress'] = false; $cfg['Servers'][$i]['extension'] = 'mysql'; $cfg['Servers'][$i]['AllowNoPassword'] = false; $i++; $cfg['Servers'][$i]['auth_type'] = 'cookie'; $cfg['Servers'][$i]['host'] = '127.0.0.1'; $cfg['Servers'][$i]['port'] = '3307'; $cfg['Servers'][$i]['connect_type'] = 'tcp'; $cfg['Servers'][$i]['compress'] = false; $cfg['Servers'][$i]['extension'] = 'mysql'; $cfg['Servers'][$i]['AllowNoPassword'] = false;
これで3307番ポートのDBにも接続できます。
実はこれphpMyAdminのドキュメントに書いてあるんですよね。
Configuration
If you use localhost as the hostname,
MySQL ignores this port number and connects with the socket,
so if you want to connect to a port different from the default port,
use 127.0.0.1 or the real hostname in $cfg['Servers'][$i]['host'].

2011年10月25日火曜日

iPhone/iPad/iPod用SSHクライアント Prompt

iPhoneのSSHクライアントをいろいろ探してみたけど、
「Prompt」に落ち着きました。

Prompt

http://itunes.apple.com/jp/app/prompt/id421507115?mt=8

f:id:ono51:20111025011145j:image:w240:right
基本的には、iPhoneで使いやすいものを探していました。
使いやすいといってもPCのターミナルのように画面分割とか複雑なことをするわけではなく、見やすいとか、タッチ操作で手軽に接続できるとか、コマンド入力が比較的楽なものですね。
また、基本的には有料のアプリが多いので、
その中から評価が高いものという点も選ぶ理由になると思います。

こんなところがいい感じPrompt

  • 画面が見やすい。(個人的感想)
  • 接続先が複数登録できる。
  • 複数同時接続が可能(画面を切り替えて使う)
  • id_rsa、id_dsaの鍵が扱える(iTunesからコピー)
  • iPhone,iPad,iPodなどのユニバーサルアプリ(1度課金すれば使えます)
  • アプリ単体でパスコードのロックがある
  • キーボード上部にコマンド入力によく使うキー(esc,ctrl,tab,/,-,|,@,カーソル,Fn,PgUp,PgDn)が配置してあるのでキーボードをほとんど切り替えなくてよい。
  • クリップボード、コピー、ペーストが使える

デメリットは、他のSSHクライアントアプリより少し高い700円(2011/10/25現在)という点くらいでしょうか。
私の場合は、iPadでも使用するので、2個購入したと思えば1個350円なので安いと思います。

2011年10月23日日曜日

secureログに出力されるpam_fprintd.so



sudoコマンド実行すると下記のログ(/var/log/secure)が出力されるようになった。


CentOS6.0 /var/log/secure
Oct 22 22:58:09 [hostname] sudo: PAM adding faulty module: /lib64/security/pam_fprintd.so
Oct 22 22:58:14 [hostname] su: PAM unable to dlopen(/lib64/security/pam_fprintd.so): /lib64/security/pam_fprintd.so: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません


見慣れないログだが、
pma_frintd.soがないのかなと思い次のコマンドでインストールしたところ直った。

yum install fprintd-pam.x86_64

インストールしてしまった後に調べたところ、
どうも次のコマンドで直るらしいが、こちらは試していない。

authconfig --disablefingerprint --update

参考
https://bugzilla.redhat.com/show_bug.cgi?id=505266#c9

同じ症状っぽいからこれが原因かも。
https://bugzilla.redhat.com/show_bug.cgi?id=505266#c4
minimalインストールするときにこのパッケージが含まれないバグなのかな?




2011年10月22日土曜日

daemontoolsのliteな使い方 (起動・停止・削除・インストール)

たまに忘れるのでdaemontools関連情報をまとめてみた。
  • デーモンの起動・停止・削除コマンド
  • runファイルの作成
  • daemontoolsインストール(CentOS6.0)

参考

http://cr.yp.to/daemontools.html


デーモンの起動・停止・削除・確認コマンド

デーモン起動

svc -u /service/job_name

デーモン停止

svc -d /service/job_name

デーモンの削除

1. プロセス停止
svc -d /service/job_name

2. シンボリックリンク修正
mv /service/job_name /service/.job_name

3. superviseの停止
svc -x /service/.job_name

4. シンボリックリンク削除
rm -f /service/.job_name

デーモンの起動確認

svstat /service/job_name
次のようにpidと起動時間が表示される
/service/job_name: up (pid 1247) 2530292 seconds
サービスの起動に失敗している場合は、起動時間が0を繰り返すことがある


runファイル(起動スクリプト)

1. runファイルを作成する

例 runファイルのパス
/path/to/daemon/job_name/run
環境に応じて環境変数や必要なコマンドを追加してください。
runファイルの内容
#!/bin/sh

PATH=/usr/local/bin:/usr/bin:/bin
export PATH

sleep 1
exec env - PATH=$PATH \
/path/to/script/job_name.pl 2>&1

2. daemontoolへの登録

runファイルのあるディレクトリへのシンボリックリンクの作成
ln -s /path/to/daemon/job_name /service/job_name


daemontoolsインストール

mkdir -p /package
chmod 1755 /package
cd /usr/local/src
wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
wget http://dl.dropbox.com/u/30648910/patch/daemontools/daemontools-0.76.errno.patch
cd /package
gzip -dc /usr/local/src/daemontools-0.76.tar.gz | tar xvf -
cd /package/admin/daemontools-0.76
patch -p1 < /usr/local/src/daemontools-0.76.errno.patch
./package/install

CentOS6.0の場合

vi /etc/inittab
次の1行をコメントアウトして保存
#SV:123456:respawn:/command/svscanboot

svscan.confを作成して保存

vi /etc/init/svscan.conf
start on runlevel [12345]
respawn
exec /command/svscanboot

次のコマンドでsvscanを起動する

initctl reload-configuration
initctl start svscan

2011年10月21日金曜日

CentOS 6.0のデフォルトパーティション



1TBのHDDにCentOS6.0をデフォルトでインストールしたところ、
/homeにほとんど割り当てられた。
抜かった・・・。
/home大好きなんだね。









FilesystemSizeUsedAvailUse%マウント位置
/dev/mapper/vg_sv1-lv_root50G13G35G27%/
tmpfs3.9G03.9G0%/dev/shm
/dev/sda1485M29M431M7%/boot
/dev/mapper/vg_sv1-lv_home858G200M814G1%/home




2011年10月20日木曜日

KyotoTycoon + KyotoCabinetのベンチマーク



KyotoTycoonが以前からすごく気になっていたのですが、
次の開発で導入すべく動作検証してみました。

まずは、KyotoTycoon + KyotoCabinet の気になるところを紹介すると。



  • DBがキャッシュ、B+ツリー、ハッシュなど選べる

  • ホットバックアップ

  • 非同期レプリケーション

  • デュアルマスタ

  • スナップショット これいいかも。lzo圧縮も効く。リカバリー用にも使える。

  • プラグインでmemcachedプロトコルが使える

  • lua拡張も使えるので、やろうと思えばなんでもあり。

  • noreplyを使うと何倍も速くなるらしい。

  • writebackで書き込むと何倍も速くなるらしい。

ブログがとても参考になります。
http://fallabs.com/blog-ja/promenade.cgi


テスト環境(DELL PowerEdge R200改)








CPUIntel Xeon CPU X3360 2.83GHz (4core)
メモリ8GB
HDD1TB (Hitachi HDT721010SLA360)
OSCentOS 6.0 (2.6.32-71.29.1.el6.x86_64)

KyotoCabinetインストール


yum install lzo-devel lzma-devel xz-devel
cd /usr/local/src
wget http://fallabs.com/kyotocabinet/pkg/kyotocabinet-1.2.70.tar.gz
tar zxfv kyotocabinet-1.2.70.tar.gz
cd kyotocabinet-1.2.70
./configure --prefix=/usr/local/kyotocabinet --enable-lzo --enable-lzma
make
make install
echo /usr/local/kyotocabinet/lib > /etc/ld.so.conf.d/kyotocabinet.conf
ldconfig


KyotoTycoonインストール


yum install lua-devel.x86_64
cd /usr/local/src
wget http://fallabs.com/kyototycoon/pkg/kyototycoon-0.9.51.tar.gz
tar zxfv kyototycoon-0.9.51.tar.gz
cd kyototycoon-0.9.51
./configure --prefix=/usr/local/kyototycoon --with-kc=/usr/local/kyotocabinet --enable-lua
make
make install
echo /usr/local/kyototycoon/lib > /etc/ld.so.conf.d/kyototycoon.conf
ldconfig


ktserver起動オプション


ktserver \
-port 11311 \
-tout 10 \
-th 16 \
-log /var/kt/log/ktserver.log -ls \
-ulog /var/kt/log/ulog -ulim 256m \
-sid 1 \
-bgs /var/kt/snapshot -bgsi 180 -bgsc lzo \
-pid /var/kt/log/kt.pid \
-cmd /var/kt/bin \
-plsv /usr/local/kyototycoon/libexec/ktplugservmemc.so \
-plex "port=11312#opts=f#tout=10" \
"/var/kt/db/casket.kch#opts=l#bnum=20000000#msiz=8g#dfunit=8"


性能評価は、使い慣れたPerlではなくあえてPHP。
daemontoolsでktserverを起動し、次のバッチを実行した。
PHPソースコード
<?php
$data = array(
    'name' => 'testname',
    'testdata' => 
        array(1,2,3,4,5,6,7,8,9,0,'abcdefghijklmnopqrstuvwxyz',
            'userid' => 'testuserid',
            'entry' => '2011-10-20 12:00:00'
        )
    );
$mem = new Memcached();
$mem->addServer('localhost',11312);
for ($i = 0; $i < 10000000; $i++) {
   $guid = md5(uniqid(mt_rand(),true)); 
   $guid = substr($guid,0,21);
   $mem->set($guid, $data);
}
※pecl memcached 2.0.0b2 (libmemcached 0.53)を使用。
perlならCache::Memcached::Fastで試しますね。

ベンチマーク結果




  • setの結果(1000万件登録)








使用メモリ2.0g
ファイルサイズ2.0g
スナップショット227M
性能12300qps


  • getの結果





性能15000qps

バッチ実行時はloadavgは常時1以下でかなり快適です。
チューニングの余地があるんでしょうが、
本番環境では常に負荷が低い方がよいこともあり、このままでも十分かも。
また、スナップショットのファイルサイズに感動ですね。
バックアップとか助かります。