sleep-sort.example.com
$numbers = array_map('intval', (array)$_GET['numbers']);
$mh = curl_multi_init();
foreach($numbers as $number){
$ch_list[$number] = curl_init("http://sleep-sort-api.example.com/?number=".$number);
curl_setopt($ch_list[$number], CURLOPT_TIMEOUT, $number+1);
curl_multi_add_handle($mh, $ch_list[$number]);
}
$active = null;
echo '<html><head><title>sleep sort</title></head><body><ol>';
do {
curl_multi_exec($mh, $active);
$ready=curl_multi_select($mh);
if($ready){
while($info=curl_multi_info_read($mh)){
echo '<li>'.floor(curl_getinfo($info['handle'], CURLINFO_TOTAL_TIME)).'</li>';
}
}
} while ($active && $ready);
echo '</ol></body></html>';
sleep-sort-api.example.com
$number = intval($_GET['number']); sleep($number); echo $number; exit;
こんな感じ?動作確認はしてない。間違ってもapi側を海の向こうに置いたりしてはいけない。多い日もnumberの数だけサーバを立ててスケールアウトすれば安心。ただしトラフィックでネットワークは死ぬ。或いは
function sleep_sort($numbers){
$max = max($numbers);
foreach($numbers as $number){
$buckets[$number] = $number;
}
$start = time();
for($i=1; $i<=$max; $i++){
$now = time()-$start;
if($buckets[$now]){
$result[] = $now;
}
}
return $result;
}
Genius sorting algorithm: Sleep sort
バケットソート
真っ当にpcntlを使う版 PHPでsleep sort
先駆者 凄いバカなプログラム
道玄坂に住んでいてまだ渋谷市場を見つけておらず、食材を買う場所がドンキホーテしかなかった頃に開発したメニュー。ドンキで調達可能な食材のみで構成されている。
1.オリーブオイルで輪切り唐辛子、おろしニンニク、ベーコンを炒める
2.トマト缶、コンソメ、ワインをいれて煮る
3.茹でたパスタにかける
完成。唐辛子、ニンニクはどっさり入れるとよりジャンクな感じに。
1.オリーブオイルで輪切り唐辛子、おろしニンニク、ベーコンを炒める
2.トマト缶、コンソメ、ワインをいれて煮る
3.茹でたパスタにかける
完成。唐辛子、ニンニクはどっさり入れるとよりジャンクな感じに。
Windows+VMware+LAMP+Eclipseで自宅開発環境を構築する
CentOS5.5にnginx0.8.53+node.js0.4.7+Redis2.2.6をインストールする
の続きです。
nginxで一旦全てのリクエストを受け、静的ファイルならnginxで返して、動的ファイルはnode.jsで書いたWebサーバへ渡します。
これでhttp://本番ドメイン名.dev/hoge.nodeにアクセスすると502 Bad Gatewayが返ってきます。次にnode.jsでWebサーバを書いて起動させます。
公式に乗ってるサンプルを元に/var/www/vhosts/本番ドメイン名/node/server.jsへ
を作成。node server.jsでサーバを起動させます。http://本番ドメイン名.dev/test.nodeへアクセスして、Hello Worldされたら動作確認完了。
拡張子.nodeに惹かれたのでこういう設定にしてますが、nginx側に存在しないファイルならnode.jsにプロキシする方式の方が良いかもしれませんね。
CentOS5.5にnginx0.8.53+node.js0.4.7+Redis2.2.6をインストールする
の続きです。
nginxで一旦全てのリクエストを受け、静的ファイルならnginxで返して、動的ファイルはnode.jsで書いたWebサーバへ渡します。
listen 80;
server_name 本番ドメイン名.dev;
access_log /var/log/nginx/本番ドメイン名;
location ~ \.node$ {
proxy_pass http://localhost:49152;
}
location / {
root /var/www/vhosts/本番ドメイン名/httpdocs;
index index.html;
}
これでhttp://本番ドメイン名.dev/hoge.nodeにアクセスすると502 Bad Gatewayが返ってきます。次にnode.jsでWebサーバを書いて起動させます。
公式に乗ってるサンプルを元に/var/www/vhosts/本番ドメイン名/node/server.jsへ
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(49152, "localhost");
console.log('Server running at http://localhost:49152/');
を作成。node server.jsでサーバを起動させます。http://本番ドメイン名.dev/test.nodeへアクセスして、Hello Worldされたら動作確認完了。
拡張子.nodeに惹かれたのでこういう設定にしてますが、nginx側に存在しないファイルならnode.jsにプロキシする方式の方が良いかもしれませんね。
Windows+VMware+LAMP+Eclipseで自宅開発環境を構築する
と書いたものの、実際にはLAMPでは無くLinuxNginxRedisNode.jsが目的なのでAMPはインストールしていないわけです。
省メモリハイパフォーマンスなWebサーバ兼リバースプロキシ。CGI版PHPと組み合わせたり、Apache+mod_phpの前にリバースプロキシとして置いたり、そういうのは割愛。
標準ではyumから入りませんが、前回EPELリポジトリを追加しているので問題ありません。
これでブラウザからCentOSのIPを叩けばスタートページが表示されます。

ただし現時点でインストールされるのは一つ前の安定版であるnginx.x86_64 0:0.8.53-1.el5のようなので、先月リリースされたばかりの1.0を使いたい場合はここら辺が参考になるかもしれません。
後は設定。
vhost毎に設定ファイルを分けたいので、/etc/nginx/nginx.confのhttp{...}内側で
して/etc/nginx/conf.d/vhosts/本番ドメイン名.confを作成。nginx.confに元から入っているserverはとりあえず放置。PHP+nginxやる場合の例がコメントアウトされているので、そういう時の参考になるかもしれません。
設定を変更したらnginx -s reloadで設定の反映。
/var/www/vhosts/本番ドメイン名/httpdocs/test.txtを作成。windowsのhostsを書き換えてアクセスして確認。windows7の場合は先ずメモ帳を管理者権限で起動してから、メニュー経由でhostsを開かないと保存が出来ません。
細かい設定は下記参照。
CoreModule
worker_processesのデフォルトは1。4コアなら4とかにすればいいのかもしれません。
HttpCoreModule
Modules
例えばGzipを使うなら
HttpGzipModule
context: http, server, location, if (x) location
らしいのでhttp内にgzip on;書けばサーバ全体で、server内に書けばそのヴァーチャルホスト内で、locationに書けばそのディレクトリで、gzipが有効になるんでしょう。たぶん。
nginxから始めるWebサーバー構築入門
ハイパフォーマンスHTTPサーバ Nginx入門
高速なインメモリKVS。
Installation
makeしたらCCなんてコマンドねーよエラーが出たのでyum install gccしてから再度make。/usr/local/bin/に取り合えず入れました。
redis v2.0.3 documentation:設定ファイル
/usr/local/bin/redis-2.2.6/redis.confを変更。
1GBのマシンなので、とりあえず半分をRedisに割り当てます。実際にはアプリでRedisをどう使うかによって、慎重に検討した方が良いかと思います。maxmemory制限に到達するとまだ期限の来ていないキーや、古いキーを消したり、SETがエラーになったりするそうなので。
今回は、メモリから溢れたキーをディスクにスワップしてくれるRedisVMは使わないので、vm-enabled noのままにしています。どうでもいいですがdaemonize yesって何だか胸がワクワクしますね。
でパスを通して
/etc/rc.d/init.d/redis-serverを作成。
Linux How-To 第1回 起動スクリプトを知って基礎を理解しよう
で自動起動。
Redis: The Definitive Guide
前回の手順で既にPython2.4.3とGitは入っているのでok。加えて
してから下記手順でインストール。
Building and Installing Node.js
とか言われるがとりあえず気にしない。$HOME/local/node/bin/nodeに入りました。
でhogeが表示されれば動作確認OK。.exitで対話型シェルを終了。
Ubuntuとかならapt-getで入れればいいんじゃないでしょうか。もしくはnvm。
Node.js
と書いたものの、実際にはLAMPでは無くLinuxNginxRedisNode.jsが目的なのでAMPはインストールしていないわけです。
nginx
省メモリハイパフォーマンスなWebサーバ兼リバースプロキシ。CGI版PHPと組み合わせたり、Apache+mod_phpの前にリバースプロキシとして置いたり、そういうのは割愛。
標準ではyumから入りませんが、前回EPELリポジトリを追加しているので問題ありません。
yum install nginx
chkconfig nginx on
/etc/rc.d/init.d/nginx start
これでブラウザからCentOSのIPを叩けばスタートページが表示されます。

ただし現時点でインストールされるのは一つ前の安定版であるnginx.x86_64 0:0.8.53-1.el5のようなので、先月リリースされたばかりの1.0を使いたい場合はここら辺が参考になるかもしれません。
後は設定。
vhost毎に設定ファイルを分けたいので、/etc/nginx/nginx.confのhttp{...}内側で
# Load config files from the /etc/nginx/conf.d directory
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/conf.d/vhosts/*.conf;
して/etc/nginx/conf.d/vhosts/本番ドメイン名.confを作成。nginx.confに元から入っているserverはとりあえず放置。PHP+nginxやる場合の例がコメントアウトされているので、そういう時の参考になるかもしれません。
server {
listen 80;
server_name 本番ドメイン名.dev;
access_log /var/log/nginx/本番ドメイン名;
location / {
root /var/www/vhosts/本番ドメイン名/httpdocs;
index index.html;
}
}
設定を変更したらnginx -s reloadで設定の反映。
/var/www/vhosts/本番ドメイン名/httpdocs/test.txtを作成。windowsのhostsを書き換えてアクセスして確認。windows7の場合は先ずメモ帳を管理者権限で起動してから、メニュー経由でhostsを開かないと保存が出来ません。
細かい設定は下記参照。
CoreModule
worker_processesのデフォルトは1。4コアなら4とかにすればいいのかもしれません。
HttpCoreModule
Modules
例えばGzipを使うなら
HttpGzipModule
context: http, server, location, if (x) location
らしいのでhttp内にgzip on;書けばサーバ全体で、server内に書けばそのヴァーチャルホスト内で、locationに書けばそのディレクトリで、gzipが有効になるんでしょう。たぶん。
nginxから始めるWebサーバー構築入門
ハイパフォーマンスHTTPサーバ Nginx入門
Redis
高速なインメモリKVS。
Installation
makeしたらCCなんてコマンドねーよエラーが出たのでyum install gccしてから再度make。/usr/local/bin/に取り合えず入れました。
redis v2.0.3 documentation:設定ファイル
/usr/local/bin/redis-2.2.6/redis.confを変更。
daemonize yes
logfile /var/log/redis
maxmemory 500MB
1GBのマシンなので、とりあえず半分をRedisに割り当てます。実際にはアプリでRedisをどう使うかによって、慎重に検討した方が良いかと思います。maxmemory制限に到達するとまだ期限の来ていないキーや、古いキーを消したり、SETがエラーになったりするそうなので。
今回は、メモリから溢れたキーをディスクにスワップしてくれるRedisVMは使わないので、vm-enabled noのままにしています。どうでもいいですがdaemonize yesって何だか胸がワクワクしますね。
ln -s /usr/local/bin/redis-2.2.6/redis.conf /etc/redis.conf
ln -s /usr/local/bin/redis-2.2.6/src/redis-server /usr/local/bin/redis-server
でパスを通して
/etc/rc.d/init.d/redis-serverを作成。
#! /bin/sh
#
# chkconfig: - 85 15
# description: Redis
# processname: redis-server
#
# Source function library.
. /etc/rc.d/init.d/functions
# Get config.
. /etc/sysconfig/network
# Check that networking is up.
if [ ${NETWORKING} = "no" ]
then
exit 0
fi
# See how we were called.
case "$1" in
start)
echo -n "Starting redis-server services: "
daemon /usr/local/bin/redis-server /etc/redis.conf
echo
touch /var/lock/subsys/redis-server
;;
stop)
echo -n "Stopping redis-server services: "
killproc redis-server
echo
rm -f /var/lock/subsys/redis-server
;;
restart|reload)
$0 stop
$0 start
;;
*)
echo "Usage: redis-server {start|stop|status|restart}"
exit 1
esac
exit 0
~
Linux How-To 第1回 起動スクリプトを知って基礎を理解しよう
chmod 755 /etc/rc.d/init.d/redis-server
chkconfig --add redis-server
chkconfig redis-server on
で自動起動。
Redis: The Definitive Guide
node.js
前回の手順で既にPython2.4.3とGitは入っているのでok。加えて
yum install gcc-c++
yum install openssl-devel
してから下記手順でインストール。
Building and Installing Node.js
Checking for header port.h : not found
Checking for header sys/event.h : not found
Checking for function kqueue : not found
Checking for library execinfo : not found
とか言われるがとりあえず気にしない。$HOME/local/node/bin/nodeに入りました。
node
console.log("hoge");
でhogeが表示されれば動作確認OK。.exitで対話型シェルを終了。
Ubuntuとかならapt-getで入れればいいんじゃないでしょうか。もしくはnvm。
Node.js
VMware・CentOS・Apache・MySQL・PHP・Git
「喫茶店プログラミング」のための環境構築(VMwarePlayer + CentOS5.5+Apache2.2.3+MySQL5.5.8+PHP5.3.5+Ruby1.8.7+おまけ)
を参照。
Samba
CentOS上でVimやらEmacsやらで開発するならこれで終了ですが、Windows上のEclipseから開発したいので、何らかの形でWindowsからCentOSのファイルを触れるようにしなければなりません。VMwareToolsのファイル共有機能を使って繋げる方法もありますが、私の環境だと何か動かなかったので、下記を参照してインストール・設定。
VMware×CentOS×Samba windowsから開発できる環境を作ろう
Eclipse
All in One Eclipseをダウンロードしてインストール。最後にEclipseからGitを操作するため、Egitプラグインをインストールして終了。
