スクリプト

気分転換がてら、30分ででっち上げてみた。オブジェクト指向とかモジュール化なんていう高尚な目的はさておき、せめてサブルーチン化しようよと思いつつも、処理は一直線だし、単発ものなのでいいかと自分に嘘をついてみる。まあ、動かしたものがちって事で。
ちゃんとやるなら

  • Jcodeを通してないので、日本語処理に危険性あり
  • 正規表現で引っかけているタグが各ページ一つしか存在しないと仮定している

が不安だけど、動いてるから由とする。:-)
本当は全てのPerlを5.8系にして、JcodeのかわりにEncodeを使うべき何だろうけど、諸事情で一部だけ5.6系を使い続ける必要があるので、互換性がなくなっちゃうんですよね。

CPAN module

  • DBI
  • DBD::Pg
  • LWP::UserAgent

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に仕掛ければよいだけなんですが、その手間が面倒で今に至る。二ヶ月後にも同じ事繰り返して装だけど、眠気に勝てないのでお休みなさい。