上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

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.茹でたパスタにかける

完成。唐辛子、ニンニクはどっさり入れるとよりジャンクな感じに。
Windows+VMware+LAMP+Eclipseで自宅開発環境を構築する
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はインストールしていないわけです。

nginx



省メモリハイパフォーマンスなWebサーバ兼リバースプロキシ。CGI版PHPと組み合わせたりApache+mod_phpの前にリバースプロキシとして置いたり、そういうのは割愛。

標準ではyumから入りませんが、前回EPELリポジトリを追加しているので問題ありません。


yum install nginx
chkconfig nginx on
/etc/rc.d/init.d/nginx start


これでブラウザからCentOSのIPを叩けばスタートページが表示されます。

WS000000.jpg

ただし現時点でインストールされるのは一つ前の安定版である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プラグインをインストールして終了。
copyright © 2005 The elephant vanishes all rights reserved.
Powered by FC2ブログ.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。