気分転換がてら、30分ででっち上げてみた。オブジェクト指向とかモジュール化なんていう高尚な目的はさておき、せめてサブルーチン化しようよと思いつつも、処理は一直線だし、単発ものなのでいいかと自分に嘘をついてみる。まあ、動かしたものがちって事で。
ちゃんとやるなら
- Jcodeを通してないので、日本語処理に危険性あり
- 正規表現で引っかけているタグが各ページ一つしか存在しないと仮定している
が不安だけど、動いてるから由とする。:-)
本当は全てのPerlを5.8系にして、JcodeのかわりにEncodeを使うべき何だろうけど、諸事情で一部だけ5.6系を使い続ける必要があるので、互換性がなくなっちゃうんですよね。
PostgreSQL
CREATE TABLE hatena (
id SERIAL PRIMARY KEY,
time TIMESTAMP NOT NULL,
pv INT
);
本体
#!/usr/local/bin/perl###
use strict;
use warnings;
use LWP::UserAgent;
use DBI;###
my $database = "hatena";
my $host = "localhost";
my $port = "5432";
my $dsn = "dbi:Pg:dbname=$database;host=$host;port=$port";
my $user = "XXXXXXXX";
my $password = "YYYYYYYY";###
my $dbh = DBI->connect( "$dsn", "$user", "$password", {
PrintError => 0,
RaiseError => 1,
AutoCommit => 1
}); # or die "cannot connect to mysql database: $DBI::errstr\n";###
my $ua = LWP::UserAgent->new;
$ua->agent('Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');my $req = HTTP::Request->new(GET => "http://d.hatena.ne.jp/cutxout/");
my $res = $ua->request($req);my @result = grep m|\d+|,
split m|\n|,$res->content;###
my $result;
foreach (@result){
m|(\d+)|;
$result = $1;
}my $sth = $dbh->prepare( "INSERT INTO hatena (time,pv) VALUES ('now',?)" );
$sth->bind_param(1,$result);
$sth->execute;
$sth->finish;$dbh->disconnect;
Perlで排他処理
この手のスクリプトを書く度に思うこと。flockの使い方を学ぶ前にRDBMSとの連携方法を知ってしまったので、未だにflockの使い方を知らないままだったりします。いいのかな...
VACUMM FULL ANALYZE
かれこれ二ヶ月くらい、vacumm処理してないことを思い出しました。cronに仕掛ければよいだけなんですが、その手間が面倒で今に至る。二ヶ月後にも同じ事繰り返して装だけど、眠気に勝てないのでお休みなさい。