December 26, 2007
MyMiniCity で踏んで欲しい URL が変動しすぎる
今更感がありますし、まぁどうせすぐ人気がなくなるんだろうなーとか思いつつ、MyMiniCity が最近面白いです。
みなさんよりちょっと遅めに始めたんですが、なかなか街が成長させるのが難しくて面白い。
nipotan - MyMiniCity
MyMiniCity とは何ぞや的な話については、既に語りつくされているので、ここでは詳細を端折りますけど、まぁ、ザックリ言えば誰かにアクセスしてもらって、アクセスの都度人口が増えていくわけですよ。
同日に 1 IP アドレスからしか受け付けないっぽいので、何回リロードしても無駄なのですが。
人口が増えるにつれて、色々問題が起こって、段階に応じて「その問題を解決させるための URL」が登場し、今度は人口を増やさないが問題を解決するための URL を踏ませないと人口が飽和状態になって色々な問題が起こります。
人口が増えると…
で、色々工夫して色々な人にアクセスしてもらうよう頑張っているのですが、どうも人口増やそうと思って "/" にアクセスしてもらうと、無駄に人口が増えて環境が破壊されていく。
例えば失業者が増えていって、失業者救済のために "/ind" にアクセスしてもらうと人を誘導しようとすると、明らかに人口とはアンバランスなほどの工場が出来てしまうし、人口も伸び悩む。
結局、環境が破壊されない限りは人口を増やすのがいいんだけど、そのバランスや誘導方法が異常に難しいな…と思ってます。
「こっち見て!」
「こんどはこっち見て!」
って、人を振り回すのが面倒くさかったので、その時の街の状況に応じて自動的にアクセスさせる先を選んでリダイレクトするようにできないかなって思い付いたので、ざっと適当に作ってみました。
もしよかったら、どんどんアクセスしてみてください。
環境のバランスが崩れた時に自浄作用が働きますんで。
http://mmc.nipotan.org/
ちなみに、URL を
http://mmc.nipotan.org/街の ID/
みたいにすると、問題が起こっている限りその街で、一番バランス悪いところに重点的にリダイレクトし、そうでなければ人口を増やす URL にリダイレクトするようになります。
MyMiniCity を使ってる方は、もしよかったら使ってみてください。
一応コードも晒しておきますね。
みなさんよりちょっと遅めに始めたんですが、なかなか街が成長させるのが難しくて面白い。
nipotan - MyMiniCity
MyMiniCity とは何ぞや的な話については、既に語りつくされているので、ここでは詳細を端折りますけど、まぁ、ザックリ言えば誰かにアクセスしてもらって、アクセスの都度人口が増えていくわけですよ。
同日に 1 IP アドレスからしか受け付けないっぽいので、何回リロードしても無駄なのですが。
人口が増えるにつれて、色々問題が起こって、段階に応じて「その問題を解決させるための URL」が登場し、今度は人口を増やさないが問題を解決するための URL を踏ませないと人口が飽和状態になって色々な問題が起こります。
人口が増えると…
- 失業率が増える → 工場を作る /ind
- 交通渋滞が起こる → 交通を整備する /tra
- 犯罪が増える → 警官を配備する /sec
- 汚染が拡大する → 公園を作る /env
で、色々工夫して色々な人にアクセスしてもらうよう頑張っているのですが、どうも人口増やそうと思って "/" にアクセスしてもらうと、無駄に人口が増えて環境が破壊されていく。
例えば失業者が増えていって、失業者救済のために "/ind" にアクセスしてもらうと人を誘導しようとすると、明らかに人口とはアンバランスなほどの工場が出来てしまうし、人口も伸び悩む。
結局、環境が破壊されない限りは人口を増やすのがいいんだけど、そのバランスや誘導方法が異常に難しいな…と思ってます。
「こっち見て!」
「こんどはこっち見て!」
って、人を振り回すのが面倒くさかったので、その時の街の状況に応じて自動的にアクセスさせる先を選んでリダイレクトするようにできないかなって思い付いたので、ざっと適当に作ってみました。
もしよかったら、どんどんアクセスしてみてください。
環境のバランスが崩れた時に自浄作用が働きますんで。
http://mmc.nipotan.org/
ちなみに、URL を
http://mmc.nipotan.org/街の ID/
みたいにすると、問題が起こっている限りその街で、一番バランス悪いところに重点的にリダイレクトし、そうでなければ人口を増やす URL にリダイレクトするようになります。
MyMiniCity を使ってる方は、もしよかったら使ってみてください。
一応コードも晒しておきますね。
package MMC::Dispatcher;
use strict;
use LWP::Simple ();
use Apache::Constants qw(:response);
use Apache::Request;
use constant DEFAULT_USER => 'nipotan';
our %URI_MAPPING = (
unemployment => '/ind',
transport => '/tra',
criminality => '/sec',
pollution => '/env',
);
sub handler {
my $r = Apache::Request->new(shift);
my $user = $r->param('u') || default_user($r);
my $url = determine_url($user);
$r->header_out(Location => $url);
return REDIRECT;
}
sub default_user {
my $r = shift;
return $r->dir_config('MMCDefaultUser') || DEFAULT_USER;
}
sub determine_url {
my $user = shift;
my $user_url = sprintf('http://%s.myminicity.com', $user);
my $xml_url = $user_url . '/xml';
my $xml = LWP::Simple::get($xml_url);
return $user_url . '/' unless $xml;
my %statistics = ();
$statistics{$1} = $2 while $xml =~ m{<([^<>]+?)>(\d+)</\1>}g;
my @rand_table = ();
my $total = 0;
for my $name (qw(unemployment transport criminality pollution)) {
my $percent = $name eq 'transport' ?
100 - $statistics{$name} : $statistics{$name};
next unless $percent;
$total += $percent;
push @rand_table, [$total - 1, $name];
}
return $user_url . '/' unless $total;
return $user_url . $URI_MAPPING{$rand_table[0]->[1]} if @rand_table == 1;
my $emphasis;
my $random = int(rand($total));
for my $data (@rand_table) {
return $user_url . $URI_MAPPING{$data->[1]} if $random <= $data->[0];
}
return $user_url . '/'; # XXX
}
1;