2011年11月21日月曜日

apc_fetch() VS Memcached::get() - ローカル環境キャッシュパフォーマンス比較



ローカル環境でのキャッシュは、APCとMemcachedでどちらを使うか?
apc_fetchが手軽に利用できるのでこちらを使ってみましたが、
memcachedでいいんじゃないかと・・・気になったので計測してみました。
ただし、CLI環境です。
テスト環境(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)


apcの設定



apc.enabled=On
apc.enable_cli=On
apc.shm_size="128M"



比較に使用したソースコード(PHP)


$id = 'testtest';
$test_data = array();
$mem = new Memcached();
$mem->addServer('/tmp/memcached.socket',0);

for ($i = 0; $i < 1000; $i++) {
$cur_array = array();
for ($j = 0; $j < 10; $j++) {
$cur_array[$j] = '0123456789abcdef';
}
array_push($test_data,$cur_array);
}

apc_store($id,$test_data,1000);
$mem->set($id,$test_data,1000);

$time_start = microtime(true);
for ($i = 0; $i < 10000; $i++) {
$res = apc_fetch($id);
}
$time_end = microtime(true);
$diff_apc = $time_end - $time_start;

$time_start = microtime(true);
for ($i = 0; $i < 10000; $i++) {
$res = $mem->get($id);
}
$time_end = microtime(true);
$diff_mem = $time_end - $time_start;
echo 'APC : ' . $diff_apc . PHP_EOL;
echo 'Mem : ' . $diff_mem . PHP_EOL;



結果









関数平均処理時間(ms)
apc_fetch()10
Memcached::get5

結果は、memcachedが2倍速い
また、new MemcachedとaddServer()を毎回実行した場合でも、
0.5msほどしか影響しませんでした。
5msの違いでも、10000回実行すると50秒差が出ます。
パフォーマンス優先ならmemcachedですね。

ちなみにmemcachedでunix socketを使用していますが、
IPアドレス(127.0.0.1)でのアクセスでも同程度の処理速度となりました。
ローカル環境でtcpポートの枯渇が気になる場合は、unix socketがオススメです。




2011年11月12日土曜日

CentOS 6.1でまだまだLAMP環境 MySQL 5.5.19 インストール編



前回のCentOS 6.1のインストールに引き続き、
MySQL 5.5.19をインストールします。

今回のインストール手順と同じ処理を行うバッチを作成しました。
管理者権限があれば次の1行でインストールできます。
ご使用になられた場合の損害は一切責任を負いませんのでご了承ください。

curl http://dl.dropbox.com/u/30648910/install/mysql/mysql.sh | env MYSQL_VERSION=5.5.19 sh



MySQL 5.5.19をソースコードからインストール




▼インストールに必要なモジュール


yum -y install \
make.x86_64 \
cmake.x86_64 \
gcc.x86_64 \
gcc-c++.x86_64 \
ncurses.x86_64 \
ncurses-devel.x86_64 \
bison.x86_64 \
libaio-devel.x86_64

libaio-devel.x86_64を追加(2012/4/12)



▼mysqlアカウント追加


groupadd mysql
useradd -d /home/mysql -g mysql -r -s /sbin/nologin mysql


▼既存のファイルをリネーム


mv /etc/my.cnf /etc/my.cnf.bak
mv /usr/lib64/mysql /usr/lib64/mysql_bak


▼ソースコードをダウンロードして解凍


cd /usr/local/src
curl -o mysql-5.5.19.tar.gz http://ftp.iij.ad.jp/pub/db/mysql/Downloads/MySQL-5.5/mysql-5.5.19.tar.gz
tar zxfv mysql-5.5.19.tar.gz
cd mysql-5.5.19


▼ビルドしてインストール(utf8mb4をDEFAULT_CHARSET)


cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci
make
make install


▼MySQL初期化


mkdir /usr/local/mysql/etc
cd /usr/local/mysql
chown -R mysql:mysql .
./scripts/mysql_install_db --user=mysql --skip-name-resolve


▼my.cnf設置


cp /usr/local/src/mysql-5.5.19/support-files/my-medium.cnf /usr/local/mysql/etc/my.cnf
chown -R root .
chown -R mysql:mysql /usr/local/mysql/data
ln -s /usr/local/mysql/lib /usr/lib64/mysql
ldconfig


▼MySQL起動、停止、再起動


起動
/usr/local/mysql/support-files/mysql.server start
停止
/usr/local/mysql/support-files/mysql.server stop
再起動
/usr/local/mysql/support-files/mysql.server restart


▼パスの設定


bashの場合
vi $HOME/.bashrc
zshの場合
vi $HOME/.zshrc

次の2行を追記して保存する
PATH=$PATH:/usr/local/mysql/bin
export PATH

bashの場合
source $HOME/.bashrc

zshの場合
source $HOME/.zshrc
rehash

MySQLクライアントを起動して確認する
mysql


▼依存関係も含めインストールされるモジュール


make-3.81-19.el6.x86_64
cmake-2.6.4-5.el6.x86_64
gcc-4.4.5-6.el6.x86_64
gcc-c++-4.4.5-6.el6.x86_64
ncurses-5.7-3.20090208.el6.x86_64
pkgconfig-0.23-9.1.el6.x86_64
ncurses-devel-5.7-3.20090208.el6.x86_64
bison-2.4.1-5.el6.x86_64





2011年11月6日日曜日

Macで半角カタカナ・imode絵文字を入力する for OS X Lionの環境設定



久しぶりにフィーチャーフォン(ガラケー)の開発をしてます。
Lionでガラケーの開発するとは思ってなかったんですが・・・。

ガラケーのviewは、Shift_JISでxhtml書いて半角カタカナやimode絵文字を当然のように入力します。
プログラムで出力前に自動変換するのも一般的ですが、
私の場合は、文字コード以外はできるだけ自動変換しないのが好きですね。
見た目と同じほうがデバッグも修正も楽なので。
あと、こだわるとあえて全角にしたい場合もありますからね。

それでは、macで半角カタカナとか入力したことなかったのですが、
作業しやすいように設定を変更してみます。


  • 半角カタカナの入力設定

  • キーボードのファンクションキー(fn)変更

  • imode絵文字の入力




半角カタカナの入力設定




  1. [システム環境設定]→[言語とテキスト]を開く

  2. [入力ソース]タブをクリック

  3. 「 使用する入力ソースを選択してください。」の下に表示されているリストをひたすたスクロールして、なんとか「ことえり」までたどり着く。

  4. [半角カタカナ]にチェックをつける

f:id:ono51:20111105160936p:image:w240

キーボードのファンクションキー(fn)変更


この設定はファンクションのキーの使用頻度に応じて設定してください。
個人的に半角カタカナ入力するときはこちらの方が楽です。


  1. [システム環境設定]→[キーボード]を開く

  2. 「F1、F2などのすべてのキーを標準のファンクションキーとして使用する」にチェックを付ける

f:id:ono51:20111105160659p:image:w240

これで、F8キー1発で半角カタカナに変換できます。
また、Shift+Control+[;セミコロン]で直接半角カタカナの入力モードに変更できます。

imode絵文字の入力


imode絵文字の入力ですが、以前は「エモジモ2」というアプリが使えたようなのですが、
残念ながら開発中止になっているようです。
代替アプリを探しているのですが今のところ見つからないですね。
(あったら教えてください。)

代替アプリではないのですが、
こちらのサイトでクリップボードにコピーして使えます。


  • iモード・絵文字パッド

http://sv.cont-cont.com/emojipad-i/

エディター上に絵文字が表示されるわけではないので、
見た目で確認できないのが少し残念です。

いろいろ試していますが全部mac1台で作業化は今一歩のところですね。
あとは、imode絵文字だけなんですけどね。
とはいえ、フィーチャーフォンで絵文字は必須なので、
viewはWindowsで作業するのが無難なようです。

しばらくはVMWareFusion+Windowsが手放せないようです。




2011年11月5日土曜日

今さら人には聞けないMySQLの話(いにしえのold-passwordsオプション for MySQL5.5)



Perl使いもお世話になっていると思われるphpMyAdminで
MySQLにログインできないことが・・・・あった・・・。


#2000 MySQL サーバにログインできません


というわけで接続確認したところ


<?php
$dbh = mysql_connect("127.0.0.1","ユーザー名","パスワード") or die(mysql_error());


このようなエラーメッセージが、以下抜粋


mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication.
Please use an administration tool to reset your password with the command SET PASSWORD = PASSWORD('your_existing_password').
This will store a new, and more secure, hash value in mysql.user.
If this user is used in other scripts executed by PHP 5.2 or earlier you might need to remove the old-passwords flag from your my.cnf file


つまり、MySQL4.1以前の古い安全ではない認証では接続できないので、
old-passwordsオプション外して、パスワード再設定してよ!ってことらしい。
http://dev.mysql.com/doc/refman/5.5/en/old-client.html

それならold-passwordsオプションで起動できないようにしてほしいような気もするが。
起動はできるしパスワードも設定できるんだな。
MySQL4.0など古いDBのデータ移行やmy.cnfの設定引き継いだ場合は注意が必要です。

というか、old-passwordsオプション使ってたんだ・・・。




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円なので安いと思います。