Perl で、RSS を処理する

使用するモジュール
use Encode;
use Encode::Guess;
use XML::RSS;
use LWP::UserAgent;
use HTTP::Request;
#!/usr/bin/perl

use Encode;
use Encode::Guess;
use XML::RSS;
use LWP::UserAgent;
use HTTP::Request;

my $url = 'https://perltips.twinkle.cc/index.rdf';

# 初期化
my $proxy = new LWP::UserAgent;       # UseAgent の作成
my $req   = new HTTP::Request(GET=>$url);
my $rss   = new XML::RSS;
my $res   = $proxy->request($req);    # $url にアクセスする
my $xml   = $res->content;            # コンテンツ (この場合は RSS/XML) を取得
my $enc   = guess_encoding($xml, qw/euc-jp shiftjis 7bit-jis utf8/); # 文字コードを判定
ref($enc) or die "Can't guess: $enc"; # 自動判定がうまくいかなかったときのエラー処理
# utf8 で保存 ($enc->name を decode することにより、utf8 で変数に保管される
$xml = decode($enc->name, $xml);

eval {
    $rss->parse($xml);
};

if($@) { # $rss->parse が失敗したとき
    print "error\n";
}

# @{$rss->{items}} に、RSS のすべてのエントリー (item) が入る
foreach my $item ( @{$rss->{items}} ) {

    # ケータイ (iモード) で出力したいので Shift_JIS にする
    my $title       = encode('shiftjis', $item->{title});
    my $description = encode('shiftjis', $item->{description}); # 上に同じ

    print qq|<a href="$item->{link}">$title</a>\n|; # タイトルをリンクつきで出力
    print qq|$description<br />\n|;                 # 概要 (description) を出力
}

exit;
使用するモジュール
use Encode;
use Encode::Guess;
use XML::RSS;
use LWP::UserAgent;
use HTTP::Request;
#!/usr/bin/perl

use Encode;
use Encode::Guess;
use XML::RSS;
use LWP::UserAgent;
use HTTP::Request;

my $url = 'https://perltips.twinkle.cc/index.rdf';

# 初期化
my $proxy = new LWP::UserAgent;       # UseAgent の作成
my $req   = new HTTP::Request(GET=>$url);
my $rss   = new XML::RSS;
my $res   = $proxy->request($req);    # $url にアクセスする
my $xml   = $res->content;            # コンテンツ (この場合は RSS/XML) を取得
my $enc   = guess_encoding($xml, qw/euc-jp shiftjis 7bit-jis utf8/); # 文字コードを判定
ref($enc) or die "Can't guess: $enc"; # 自動判定がうまくいかなかったときのエラー処理
# utf8 で保存 ($enc->name を decode することにより、utf8 で変数に保管される
$xml = decode($enc->name, $xml);

eval {
    $rss->parse($xml);
};

if($@) { # $rss->parse が失敗したとき
    print "error\n";
}

# @{$rss->{items}} に、RSS のすべてのエントリー (item) が入る
foreach my $item ( @{$rss->{items}} ) {

    # ケータイ (iモード) で出力したいので Shift_JIS にする
    my $title       = encode('shiftjis', $item->{title});
    my $description = encode('shiftjis', $item->{description}); # 上に同じ

    print qq|<a href="$item->{link}">$title</a>\n|; # タイトルをリンクつきで出力
    print qq|$description<br />\n|;                 # 概要 (description) を出力
}

exit;

Perl で、文字コードの自動判定をする

たとえば、LWP::UserAgent で取得した RSS (= XML ファイル) の文字コードの自動判定 (エンコーディングの自動判定) を行うには、以下のようにする。
#!/usr/bin/perl

use Encode::Guess;
use LWP::UserAgent;
use HTTP::Request;

my $url = 'https://perltips.twinkle.cc/index.rdf';

my $proxy = new LWP::UserAgent;
my $req   = new HTTP::Request(GET=>$url);
my $res   = $proxy->request($req);
my $xml   = $res->content;
my $enc   = guess_encoding($xml, qw/euc-jp shiftjis 7bit-jis utf8/);
ref($enc) or die "Can't guess: $enc"; # 自動判定に失敗したときのエラー処理
$xml = decode($enc->name, $xml);      # utf8 で保存

...
たとえば、LWP::UserAgent で取得した RSS (= XML ファイル) の文字コードの自動判定 (エンコーディングの自動判定) を行うには、以下のようにする。
#!/usr/bin/perl

use Encode::Guess;
use LWP::UserAgent;
use HTTP::Request;

my $url = 'https://perltips.twinkle.cc/index.rdf';

my $proxy = new LWP::UserAgent;
my $req   = new HTTP::Request(GET=>$url);
my $res   = $proxy->request($req);
my $xml   = $res->content;
my $enc   = guess_encoding($xml, qw/euc-jp shiftjis 7bit-jis utf8/);
ref($enc) or die "Can't guess: $enc"; # 自動判定に失敗したときのエラー処理
$xml = decode($enc->name, $xml);      # utf8 で保存

...

Perl で、住所から緯度経度を取得する方法

Geo::Google モジュールを利用する (米国)。住所を渡せばコーディング的にはほとんど 1行で緯度経度を返してくれる。Google Maps にアクセスしにいって緯度経度を取ってきていてるので、地図データベースは Google Maps のものである。以前紹介した PHP のときのように SOAP も何もいらない (Geo::Google は、内部で LWP::Simple を利用している)。PHP の Geocoder 版は、Geocoder のデータベースに SOAP 経由でアクセスする。少し使ってみた結果、Geocoder のデータベースは少しズレが生じるようである (米国の場合)
use utf8;
use Encode;
use Geo::Google;
use XML::Parser;
#!/usr/bin/perl

use utf8;
use Encode;
use Geo::Google;
use XML::Parser;

my $lng, $lat;
my $address1 = 'your address part 1 here';
my $address2 = 'your address part 2 here';


my ($degree) = getDegrees("$address1 $address2");

if($degree) {

    $lng = $degree->longitude;
    $lat = $degree->latitude;

} else {

    $lng = ''; $lat = '';
}

sub getDegrees {    #  住所から緯度経度を検索

    return $GEO->location( address => Encode::encode_utf8(shift));
                                                        # shift = address / リファレンスを返す
}
Geo::Google モジュールを利用する (米国)。住所を渡せばコーディング的にはほとんど 1行で緯度経度を返してくれる。Google Maps にアクセスしにいって緯度経度を取ってきていてるので、地図データベースは Google Maps のものである。以前紹介した PHP のときのように SOAP も何もいらない (Geo::Google は、内部で LWP::Simple を利用している)。PHP の Geocoder 版は、Geocoder のデータベースに SOAP 経由でアクセスする。少し使ってみた結果、Geocoder のデータベースは少しズレが生じるようである (米国の場合)
use utf8;
use Encode;
use Geo::Google;
use XML::Parser;
#!/usr/bin/perl

use utf8;
use Encode;
use Geo::Google;
use XML::Parser;

my $lng, $lat;
my $address1 = 'your address part 1 here';
my $address2 = 'your address part 2 here';


my ($degree) = getDegrees("$address1 $address2");

if($degree) {

    $lng = $degree->longitude;
    $lat = $degree->latitude;

} else {

    $lng = ''; $lat = '';
}

sub getDegrees {    #  住所から緯度経度を検索

    return $GEO->location( address => Encode::encode_utf8(shift));
                                                        # shift = address / リファレンスを返す
}

Linux で、cron の設定方法

cron とはプログラムを自動実行するためのもの。 cron を設定するには,「crontab」と呼ばれるコマンドを利用する。オプションは次のようになっている。
crontab [-u user] { -l | -r | -e }

■オプション内容
-u	ユーザを指定する。省略時は現在のカレントユーザになる
-l	現在のcron設定を表示する
-r	現在のcron設定を削除する
-e	現在のcron設定を編集する。設定内容がない場合は新規作成する
crontab -e を実行し、記述する書式は次の通り。
$ crontab -e

# 0分ごとに実行する
0 * * * * [コマンド]

# 5分おきに実行する
*/5 * * * * [コマンド]

# 1日1回、0時0分に実行する
0 0 * * * [コマンド]

# 0 時から 23 時までの 2 時間おきに、毎 23 分ごとに実行する
23 0-23/2 * * * [コマンド]

# 1月と 12月それぞれの 1〜20 日、23 時 00分に実行する
* 23 1-20 1,12 * [コマンド]

# 日曜日(0)から土曜日(6)まで 1分おきに実行する
*/1 * * * 0-6 [コマンド]
日時を指定するために指定(ワイルドカード)が 5つ並んでいるが,それぞれの意味は次のようになっている。
* * * * * [コマンド]
1 2 3 4 5

■ 日時指定方法


 
左から何番目
単位
指定方法

 
1
分
0〜59、例:*/15


2
時
0〜23、例:0-23


3
日(月)
1から31、例:1-20


4
月
1〜12 (or names)、例:1,6,12

 
5
日曜〜土曜
0〜6、例:0-6


cron とはプログラムを自動実行するためのもの。 cron を設定するには,「crontab」と呼ばれるコマンドを利用する。オプションは次のようになっている。
crontab [-u user] { -l | -r | -e }

■オプション内容
-u	ユーザを指定する。省略時は現在のカレントユーザになる
-l	現在のcron設定を表示する
-r	現在のcron設定を削除する
-e	現在のcron設定を編集する。設定内容がない場合は新規作成する
crontab -e を実行し、記述する書式は次の通り。
$ crontab -e

# 0分ごとに実行する
0 * * * * [コマンド]

# 5分おきに実行する
*/5 * * * * [コマンド]

# 1日1回、0時0分に実行する
0 0 * * * [コマンド]

# 0 時から 23 時までの 2 時間おきに、毎 23 分ごとに実行する
23 0-23/2 * * * [コマンド]

# 1月と 12月それぞれの 1〜20 日、23 時 00分に実行する
* 23 1-20 1,12 * [コマンド]

# 日曜日(0)から土曜日(6)まで 1分おきに実行する
*/1 * * * 0-6 [コマンド]
日時を指定するために指定(ワイルドカード)が 5つ並んでいるが,それぞれの意味は次のようになっている。
* * * * * [コマンド]
1 2 3 4 5

■ 日時指定方法


 
左から何番目
単位
指定方法

 
1
分
0〜59、例:*/15


2
時
0〜23、例:0-23


3
日(月)
1から31、例:1-20


4
月
1〜12 (or names)、例:1,6,12

 
5
日曜〜土曜
0〜6、例:0-6