GearmanをPHPから使ってみた。

今回は、PHPでGearmanを使えるようにして、ざっと動きを確認してみました。
Gearmanの設定はこっち
ちなみに、よく知らんのだけど、Gearmanは(GearmanClient::doのように)即時実行で結果をclientに返す用途がメジャーなのかな?
ほかのサイトだと、そういう風に紹介されてました。
GearmanCient::doBackgroundをつかうと、TheSchwartzみたい?に
ジョブを突っ込むだけ突っ込んであとはお願いね〜ということができるので
今回はこっちを使います。


はい、まず Gearman PHP Extensionを入れます。

yum install php-devel
wget http://pecl.php.net/get/gearman-0.7.0.tgz
tar xzf gearman-0.7.0.tgz
cd gearman-0.7.0
phpize
./configure
make
make install

OK。


php.iniにextensionの記述を追加します。
CentOSだと/etc/php.d/以下にiniを置けばOKぽいのでそうしてみます。

# iniファイルつくって
echo 'extension=gearman.so' | cat > /etc/php.d/gearman.ini
# apache再起動
service httpd restart
# 動いてるかな?
php -r 'print gearman_version();'

僕の環境だと、"0.14"って出力がでました。わーい


さて、さっそくテスト。
まず、worker。
ただ、printするだけ。
worker.php

<?php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('test', 'my_test');
while ($worker->work());

function my_test($job) {
        print $job->workload()."\n";
}


clientもつくる
client.php

<?php
$client = new GearmanClient();
$client->addServer();
$time = time();
print $time."\n";
$client->doBackground("test", $time);
if ($client->returnCode() != GEARMAN_SUCCESS) {
    print "faild add job!\n";
}

できた。

$ php worker.php

でworkerを起動。
別のterminalを開いて

$ php client.php

を実行するとそれぞれ

$ php worker.php
1294802686
$ php client.php
1294802686

となります。ちゃんとjobが渡ってますね。


さて、ここから障害時にどうなるかをちょっとみてみました。

workerが死んでたらどうなるの?

$ php client.php 
1294802944
$ php client.php 
1294802946

clientは問題なく動きます。

select * from queue;
+--------------------------------------+---------------+----------+------------+
| unique_key                           | function_name | priority | data       |
+--------------------------------------+---------------+----------+------------+
| 713ed7c0-7e51-4e9a-8f99-76f66693bfd6 | test          |        1 | 1294802946 | 
| 349f796f-6a00-4ef1-ba81-48a3b2a52468 | test          |        1 | 1294802944 | 
+--------------------------------------+---------------+----------+------------+
2 rows in set (0.00 sec)

mysqlにも溜まってますね。
ここで、workerを動かすと

$ php worker.php 
1294802944
1294802946

jobが消化されました。
ここまでは、ジョブキューとして当然の動きですね。

gearmandが死んでたら?

$ php client.php 
1294803188
PHP Warning:  GearmanClient::doBackground(): gearman_connection_flush:could not connect in /home/toshiyuki/gearman_test/client.php on line 6
faild add job!

もちろん、キューに突っ込めないので、clientがエラーになります。


workerを動かすと

$ php worker.php

お、何ともなく動く。
じゃあ、ここで、gearmandを起動。

 gearmand -q libdrizzle --libdrizzle-db=gearman_queue --libdrizzle-table=queue --libdrizzle-user=root -u root -d
$ php worker.php
1294803787
1294803789
1294803789
1294803790

お!来た!! これは想定外。動かないと思ったよ。
gearmand起動から、job実行まで5秒くらいかかりますが、ちゃんと動きました!


ということで、clientのdoBackgroundで例外補足したら、gearmandを起動させて、再度doBackgroundをすれば障害時にも何とかなりそうです。
workerはその際についでに生きてるか確認するか、cronで確認すればOKでしょう。

<?php
function errorHandler($no, $msg, $file, $line) {
        throw new Exception($msg, $no);
}
set_error_handler('errorHandler');

$client = new GearmanClient();
$client->addServer();
$time = time();
print $time."\n";
$try = 0;
while ($try < 3) {
    $try++;
    try {
        $client->doBackground("test", $time);
        break;
    } catch (Exception $e) {
        print "start gearmand!\n";
        system('gearmand -q libdrizzle --libdrizzle-db=gearman_queue --libdrizzle-table=queue --libdrizzle-user=root -u root -d');
        print "wait: ".($try*$try)."s\n";
        sleep($try*$try);
    }
}
if ($client->returnCode() != GEARMAN_SUCCESS) {
    print "faild add job!\n";
}
$ php client.php 
1294804988
start gearmand!
wait: 1s

わーい入れれた!

TheSchwartzの代わりにGearman+libdrizzleでジョブキューサーバ作る

TheSchwartzはPHPのライブラリないのかね?
ざっと探したけど見つからなかったので、
Gearmanを代わりに使ってみる。

Gearman単体だと、キューがメモリ上に置かれちゃって、落ちたときとかに吹っ飛ぶのでlibdrizzleを使ってMySQLにキューを置くようにします。

# libevent-develが別途必要。
yum install libevent-devel

# 最初にlibdrizzleをインストール
wget http://launchpad.net/libdrizzle/trunk/0.8/+download/libdrizzle-0.8.tar.gz
tar xzf libdrizzle-0.8.tar.gz
cd libdrizzle-0.8
./configure
make
make install

cd ..

# gearmand インストール
wget http://launchpad.net/gearmand/trunk/0.14/+download/gearmand-0.14.tar.gz
tar xzf gearmand-0.14.tar.gz
cd gearmand-0.14
./configure
make
make install

インストールは簡単。


さて、MySQLはもう入ってる前提で。
DBつくってキュー用のテーブル作ります。

create database gearman_queue;
create table queue (
    unique_key VARCHAR(64) PRIMARY KEY,
    function_name VARCHAR(255),
    priority INT,
    data LONGBLOB
);

できた。

gearmand起動!

gearmand -q libdrizzle --libdrizzle-db=gearman_queue --libdrizzle-table=queue --libdrizzle-user=root --libdrizzle-password= -d -u root

試しにキューに突っ込んでみる

gearman -f testq -b payload

お、いけてそう

出してみる

gearman -f testq -w

payload
ってでればOK。

突っ込んでから、select * from queue;すると、ちゃんと入ってるのも確認。

わーい意外と簡単にできた。
使い勝手とかは後で書きます!

CentOS5.5にrails環境つくるよ(Passenger)

http://www.thoughtpolice.co.uk/vmware/
からダウンロードできるCentOS5.5にrails環境を作るまでのメモ。
ほかの所でもまとめられているのを知りつつも。
# rootで作業してます。

rubyのインストール。
rubyyumで入れると、バージョンが古いので、
最新のソースをビルドしてぶち込む。
その前に必要なものを一式ぶち込む。

# add rpmforge repository
wget http://dag.wieers.com/packages/RPM-GPG-KEY.dag.txt
wget http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
rpm -ivh rpmforge-release-0.3.6-1.el5.rf.i386.rpm
rpm --import RPM-GPG-KEY.dag.txt

# install building tool
yum install gcc
yum install checkinstall

rubyのソースからrpm作る。

wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p330.tar.bz2
tar xzvf ruby-1.8.7-p330.tar.bz2
cd ruby-1.8.7-p330
./configure --prefix=/usr
make
checkinstall -R --fstrans=no

できたrpmをインストール。

cd /usr/src/redhat/RPMS/i386
rpm -i ruby-1.8.7-p174-1.i386.rpm

gemが動かないので足りてないライブラリをインストール

yum install zlib-devel
cd /root/ruby-1.8.7-p330/ext/zlib
ruby extconf.rb --with-zlib-include=/usr/include -with-zlib-lib=/usr/lib
make
make install

gemsが入ってなければ↓
rubyインストールしたら勝手に入ったと記憶。

wget http://rubyforge.org/frs/download.php/73882/rubygems-1.4.2.tgz
tar xvf rubygems-1.4.2.tgz
ruby setup.rb

passengerとpassengerをapacheに組み込むときに使うやつをごそっと。

gem install passenger
yum install gcc-c++
yum install curl-devel
yum install openssl-devel
yum install httpd-devel
yum install apr-devel
yum install apr-util-devel

cd /tmp/ruby-1.8.7-p249/ext/openssl
ruby extconf.rb --with-openssl-dir=/usr/local/ssl
make
make install
passenger-install-apache2-module

passenger-install-apache2-module
やると対話形式でインストールされる。特に設定はなかったと思うので、enter連打でOK。
↓をhttpd.confに追記。

LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-3.0.2/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-3.0.2
PassengerRuby /usr/bin/ruby

   <VirtualHost *:80>
      ServerName www.yourhost.com
      DocumentRoot /somewhere/public    # <-- be sure to point to 'public'!
      <Directory /somewhere/public>
         AllowOverride all              # <-- relax Apache security settings
         Options -MultiViews            # <-- MultiViews must be turned off
      </Directory>
   </VirtualHost>

railsをインストール

gem install rails

sqlite3-rubyをインストール。
sqliteのバージョンが古いので、sqlite3-rubyのインストールができないので、sqliteをソースからインストール

wget http://www.sqlite.org/sqlite-autoconf-3070400.tar.gz
tar xvf sqlite-autoconf-3070400.tar.gz
cd sqlite-autoconf-3070400
./configure --prefix=/usr
make
make install
gem install sqlite3-ruby

mysql使いたいから

yum install mysql-server mysql-devel
gem install mysql2
# install mysql-ruby
wget http://rubyforge.org/frs/download.php/69181/mysql-ruby-2.8.2.tar.gz
rat xvf mysql-ruby-2.8.2.tar.gz
cd mysql-ruby-2.8.2
ruby extconf.rb --with-mysql-config
make
make install

これで環境構築は完了のはず。
試しにrailsアプリを動かしてみる。(httpd.confの書き換え忘れずに。)

rake new aaa /var/www/rails

で、アクセスしてみる。

production環境で動くので、development環境で動くように。
httpd.confに

RackEnv development

を追加。

mysqlを使う設定
config/database.ymlを変更。

development:
  adapter: mysql
  username: root
  password:
  host: 127.0.0.1
  database: aaa

hostはlocalhostって書くとダメらしい。

mysqlの起動とdb作成

/etc/init.d/mysqld start
rake db:create

これでOK.
間違ってたら指摘してね!

おおおおおお

なんかコメントでXDL.jsが欲しいだのちいたんのアソシエーションが欲しいだの来てたみたい。
もう1ヶ月も前だったみたいだけど。。。。
全然見てないから気づかなかったよ。
すまんね。
pluswing.netは閉じちゃったんだよねー
なんか面倒になって。(今はほとんど会社名義で仕事受けてるし。)


というかだね。
こんなん勉強にもならん(と思うし)使い物にもならんと思います!ww


どうしてもというなら、twitterでお願いしてちょ。↓すぐ気づくと思うよ。
@toshi_saito

vmware fusion3でcommand+spaceでIME切り替えする

VmwareFusion3が$30 Rebateとのことだったので、買ってみた。
申請フォームだと、アメリカかカナダしか選べなくって住所を無理やり入れてみたんだけど
大丈夫かな。。

ということで、買ったVmwareFusion3はiMacインスコ
macbookでは、うまくいってたcommand+spaceでIME切り替えがなぜかできなかったので、焦った。


MacBookAirも我慢できなくなったら買いそうなので、その時のためにメモ。
(MBAだとVMは厳しいか。。容量的にも)

VMwareFusionの環境設定からキーマッピングの設定。

  • commandがWindowsキーになっているので、これをcontrolに変更。
  • command+FがなぜかF3になっているので、これをcontrol+Fに変更。(control+Fは検索でよく使うので)
  • command+spaceをcontrol+spaceに割り当て。(追加する)
  • マウスショートカットはデフォルトの2つを外す。
  • Fusionショートカットはcommmand+Hをオフに。(置換でよく使う)

これでほぼOKなんだけど、command+spaceを押してもmac側のIMEが切り替わってしまう。。
macのシステム環境設定から
キーボード=>キーボードと文字入力

  • 前の入力ソースを選択にalt+command+spaceを割り当て。
  • 入力メニューの次のソースを選択にcommand+spaceを割り当て。

これでOK。

そういえばiMac買ったんだ。

生きてますよ。


ついこの間、iMac 27inch Late 2009を買いました。
ついに買っちゃいました。


その前に、ノートPCも EeePCからMacBook Pro 13inchにしたんだけどね。


その前には、iPhone4 16G買ったな。


さらにその前には、iPad WIFI 16G買ったな。


と、完全にApple信者になってしまったわけです。


さて、iMacですが、かなり安く買えました。
ヤマダ電機で開梱品が売ってたんですねー
実はその日に別の店舗で激安90000くらいで売ってたんだけどね。
そっちは無理だろ。。ということで翌日昼頃に池袋総本山にいってみたら
119800でQuad Coreの27inchが売ってたわけです。
(27inchの下位モデルは99800だった)


開梱品のためAppleCareは2ヶ月で切れるとのことだったんだけど
商品登録してみたら2009/10/21(発売日)に買ったと登録しても通らない。
問い合わせしてみたものの返事が遅いので1日づつ変えて試してみたら
半年分くらいのsubmitでやっと通った。


なんと開梱日は2010/5/21でした。3ヶ月ちょいしか展示してなかったのが偶然あたったのか。ラッキーでしたわ


開梱品はそれなりに心配ではあるのでAppleCare Protection Planを別途購入あと2年7ヶ月くらい?は心配なく使えそうです。


で、iMacの使い心地。
これ最高ね。画面も超絶きれいだし、広いし。
MacはUIがWin,Linとはちょっと違うからなれるまで大変かなーと思ってたけどそんなこと全くなし。
全然こっちの方がいい。
安定性も抜群。初期インストールアプリも完成度超高いし。
さくさくで快適です。

あと、配線が電源一本でOKなのもすばらしい。どこからみてもかっこいい。
Magick Mouseにワイヤレスキーボードもすばらしい出来。
電池も異常なほど持ちます。
そこらのワイヤレスマウスとは別物です。


スリープ運用もMacBook買ったあとに、そうなんだーと思ったんだけど
MacBookiMacもスリープ運用だと
触った瞬間に起動する感じで使えるから、すばらしい。


iMac買う前は朝iPadでメールチェックしてたけど、
今はiMacでざらっとチェック。返信もささっと。
まえのPCだったら起動だけでメールチェックと返信時間つぶしちゃうくらい。


ということで自慢しまくりでした。
あ、iMacは文字通り熱いやつなので、最初はビビったけど、こんなもんらしい。

iPadの悩み。

WIFI 16Gしか頭に無かったのに、
ソフトバンクの料金プランのせいで3Gを買うべきかめちゃくちゃ迷っております。

料金プランの設定を見ると
3Gなら16Gか64Gでしょう。
32Gが一番コストパフォーマンスが良くない。

  1. 0円で16Gで我慢するか、+800円で64Gにするか。。


どれだけ外で使うかにかかってるんだよね〜
これはiPadを持ってみないと何とも言えない。
iPhoneはなるだけ3G回線使わないで行こうと思ってたけど、
どこでも使えるって便利だしね。
電車であれでネットサーフィンするかね。iPhoneで済ませそうな気もしてきた。


それと、WindowsVPS借りてそれにアクセスするための端末としても使えそうな気がしてきたので、
それもいいなぁ〜とか。


とりあえず、予約は置いといて動向を見守るか。。

懸念としては、
256Mのメモリで大丈夫なのか
ってのと(OS4.0になったときに心配)
3Gは契約解除後もWIFI onlyとしても使えるのかってこと。
契約解除後は使えないんだったらWIFI 16Gだろうな。