珍しく ruby なんぞを使ってみました。それも、myminicitygrower.rb を動かすためだけに…
うちには rubygems と hpricot が入ってなかったので、慌てて apt-get してみたり。
ちなみにうちの街は http://raurucity.myminicity.com ですので皆様よろしく。
産業育成は http://raurucity.myminicity.com/ind で、交通網整備は http://raurucity.myminicity.com/tra です。
しかしそれだけでは perl 使いとして何となく悔しいので、だいたい同じことをする perl 版のスクリプトも組んでみました。HTML::TreeBuilder 使ってます。
#!/usr/bin/perl
use strict;
use LWP::UserAgent;
use HTML::TreeBuilder;
my $index_uri =
'http://twitter.g.hatena.ne.jp/keyword/MyMiniCity%e9%83%a8';
my $sleeptimer = 3;
my $tree = HTML::TreeBuilder->new();
my %dup_check = ();
my $ua = LWP::UserAgent->new();
my $response = $ua->get($index_uri);
die 'cannot retrieve index' unless $response->is_success();
$tree->parse($response->content);
$tree->eof();
foreach my $e ($tree->find("a")) {
if($e->parent()->tag() eq 'td' &&
(my $href = $e->attr('href')) =~ m|http://.+\.myminicity.com|) {
print $href;
my $response2 = $ua->get($href);
print $response2->is_success ? ' succeeded' : ' failed' ;
print "\n";
sleep $sleeptimer;
}
}
これは MyMinCity 部のページをいったん全部メモリ上に読み込んでパースしてツリーを作るっつう DOM っぽい思想のスクリプトですな。td の直下にある a から MyMiniCity っぽい href を切り出してきてます。
個人的には、HTML::Parser 使って SAX っぽくメモリ節約しながら作る貧乏性プログラマな習性が染み付いてるんで、それで作るとこんな感じになります。
#!/usr/bin/perl
use strict;
use LWP::UserAgent;
my $index_uri =
'http://twitter.g.hatena.ne.jp/keyword/MyMiniCity%e9%83%a8';
my $sleeptimer = 3;
my $p = MyHTMLParser->new();
my %dup_check = ();
my $ua = LWP::UserAgent->new();
my $request = HTTP::Request->new('GET',$index_uri);
my $response = $ua->request($request,\&parse,4096);
sub parse {
my ($data,$response,$protocl) = @_;
$p->parse($data) if $response->is_success();
}
{
package MyHTMLParser;
use base 'HTML::Parser';
sub start {
my ($self,$tagname,$attr,$attrseq,$origtext) = @_;
my $href;
if($self->{TD} == 1 &&
$tagname eq 'a' &&
($href = $attr->{href}) =~ m|http://.+\.myminicity.com|) {
print $href;
my $response2 = $ua->get($href);
print $response2->is_success ?
" succeeded\n" : " failed\n";
sleep $sleeptimer;
}
$self->{TD} = ($tagname eq 'td') ? 1 : 0;
}
sub end {
my ($self) = @_;
$self->{TD} = 0;
}
}
これもだいたい同じ動作をしますが、td の直下の a の判定について手抜きしてて、td 直下で一番目の要素である a だけを取り出してるってのが正しいとこだな。
それでまあ、ここまで作ってから思ったんだけど、MyMiniCity って、実は単に GET でアクセスするだけじゃ駄目で、flash だか javascript だかで変なことしなきゃいけなかったりしない? なんかこのスクリプト走らせても人口増えてないような気がするんだが…
あーしかし perl 書くとなんか気分が良くなるな。今日の昼間は会社で悲しい状態だったのだけど、やぱし気分転換にはコード書き散らすのが一番ぢゃよな。
Postedit :
なんか失業問題が起きてるみたいなので、我が街へのリンクを付け足しました。/ind にもアクセス誘導せんといかんのかー。
Postedit on 2007/12/21:
うお、今度は交通網も整備せんといかんのか。/tra だな。


December 20th, 2007 at 13:14
[PHP][雑記]PHPで街を育てる…
via. Rauru Blog » Blog Archive » Ruby とか Perl とかで街を育てる 空前のMyMiniCityブームですが、ようやく工場が建ち始めました。 MyMiniCity で、いきなり本題。kawadashとゆかいな仲間たち »…
December 22nd, 2007 at 18:46
[...] 「myminicityをみんなで育てるためのRubyスクリプト」や,「PHPで街を育てる」,「Ruby とか Perl とかで街を育てるComments」といったスクリプトを実行してみんなの街を発展させようという考え方はすごく良いと思うのですが,実行するインセンティブが感じられないなーということもあってこのぐりもんを作りました. [...]