Results for tag "perl"

[Perl]ATNDの参加者IDをTwitterでフォローする

30分ででっち上げたのでXMLのパースとかTwitterIDの正規表現とかいろいろ問題がありますが、何となく動いたので。
ATNDのID = TwitterのIDじゃないので誤フォローもありえます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
use strict;
use warnings;
use Net::Twitter;
use LWP::Simple;
use XML::Simple;
use URI::Escape;
 
# TwitterのID/PW
my $twitter = new Net::Twitter(
    username => 'username',
    password => 'password',
);
 
# ATNDのイベントID
my $event_id = 1;
 
my $uri = "http://api.atnd.org/events/users/?event_id=$event_id";
 
my $xml = LWP::Simple::get($uri) or die "cannot get content from $uri";
my $data = XML::Simple->new->XMLin($xml);
 
for (@{$data->{events}{event}{users}{user}}) {
    $twitter->create_friend(uri_escape_utf8 $_->{nickname}) if $_->{nickname} =~ /[A-Za-z0-9_]+/;
}

[Perl]localtimeで日本時間にならない場合の対処

Perlのlocaltime関数を使って、以下のようなコードで日本時間を出力しようとしても、何らかの原因(海外から取り寄せたサーバでタイムゾーンが違うとか)で正しく出力されない場合がある。

▼環境によってはうまく動かないコード

1
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time + 32400);

この場合、gmtime関数を使えば、必ずグリニッジ標準時を返すので以下のコードで環境に依存せずに日本時間が出力可能になる。

▼環境に依存しないコード

1
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime(time + 32400);

▼動作確認用コード

1
2
3
4
5
6
7
8
9
use strict;
use warnings;
use Perl6::Say;
 
say gmtime time;
say gmtime;
say gmtime time + 32400;
say localtime time;
say localtime;

[Perl]ドコモのiメニュー検索のキーワードを取得する

ドコモ2009夏モデルのリファラー出力記念。
ドコモのiメニューで検索した時の検索キーワードを取得します。(たぶん)
$uriの値は実際はちょっと異なります。

1
2
3
4
5
6
7
8
9
10
11
12
use strict;
use warnings;
use Perl6::Say;
use URI;
use URI::Escape;
use URI::Query;
 
my $uri = 'http://docomo.ne.jp/?key=%41%42%43';
 
my $query = URI->new($uri)->query;
my $key = (URI::Query->new($query)->hash)->{key};
say uri_unescape($key);

ドコモのドメインじゃなくてもkeyパラメータがあったらデコードしちゃいますが・・・

[Perl]新型インフルエンザの状況を調べる

職場から「新型インフルエンザの状況が第二段階(国内発生早期)またはそれ以上の段階となった場合はマスクをして来い」とお達しが出ましたが、いちいち厚生労働省のページを見に行くのがメンドくさかったのでツール作った。

2009/05/13 動かなくなってたのでlook_down(‘class’, ‘link’)をlook_down(‘class’, ‘link_icon’)に変更しました。

H1N1-Stage-Japan.pl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use strict;
use warnings;
use HTML::TreeBuilder;
use HTTP::Lite;
use Perl6::Say;
 
my $uri = 'http://www-bm.mhlw.go.jp/bunya/kenkou/kekkaku-kansenshou04/';
 
my $http = new HTTP::Lite;
$http->request($uri) || die $!;
my $body = $http->body;
 
my (undef, $tag) = HTML::TreeBuilder->new->parse($body)->eof->look_down('class', 'link_icon');
 
say $tag->as_text;

「第一段階(海外発生期)」とか返ってきます。

[Perl]PerlからExcelのグラフを作る

サンプルグラフ

サンプルグラフ

アクセス解析の専用ソフトなんて高くて買ってもらえないので、Excelでやる夫。
Win32::OLEを使ってVBAをPerlに置き換えていく感じで作っていく。
ちなみにSJISでソース書かないと日本語化けます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
use strict;
use warnings;
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Excel';
use Win32::OLE::NLS qw(:DEFAULT :LANG :SUBLANG);
 
my $excel = Win32::OLE->new('Excel.Application');
$excel->{'Visible'} = 1;
my $workbook = $excel->Workbooks->Add();
my $worksheet = $workbook->Worksheets(1);
 
# 列名
$worksheet->Cells(1,1)->{Value} = 'URI';
$worksheet->Cells(1,2)->{Value} = 'PV';
 
# データをハッシュで作る
my %pageview = (
'index.html' => 100,
'foo.html' => 84,
'bar.html' => 20,
'hoge.html' => 55,
'fuga.html' => 75,
);
 
# 2行目からデータを入れていく
my $row = 2;
while (my ($uri, $pv) = each %pageview ) {
$worksheet->Cells($row,1)->{Value} = $uri;
$worksheet->Cells($row,2)->{Value} = $pv;
$row++;
}
 
# 範囲指定して
$worksheet->UsedRange->Select;
my $range = $worksheet->Range('B2');
 
# 降順ソート
$excel->Selection->Sort({
Key1 => $range,
Order1 => xlDescending,
});
 
# グラフの設定
my $chart = $excel->Charts->Add;
$chart->Activate;
$chart->{ChartType} = xlBarClustered;
$chart->{HasTitle} = 1;
$chart->ChartTitle->Font->{Size} = 14;
$chart->ChartTitle->{Text} = 'グラフのタイトル';
$chart->{Name} = "シート名";
 
# 外枠の色
$chart->ChartArea->Interior->{Color} = 0xFFFFFF;
 
# 内側の色
$chart->PlotArea->Interior->{Color} = 0xFFFFFF;
 
# 棒グラフの枠線
$chart->SeriesCollection(1)->Border->{LineStyle} = xlNone;
 
# グラフのラベルを表示する
$chart->SeriesCollection(1)->ApplyDataLabels({ ShowValue => 1});
 
# 横棒のスタイル
$chart->Axes(xlValue)->{MajorGridlines}->{Border}->{LineStyle} = xlDot;
 
# 凡例を表示しない
$chart->{Legend}->Delete;
 
# X軸を反転(降順で表示されるようにする)
$chart->Axes(xlCategory)->{ReversePlotOrder} = 1;
 
# X軸を1つずつ表示
$chart->Axes(xlCategory)->{TickLabelSpacing} = 1;
 
# 保存して終了する場合はコメント外す
# $chart->SaveAs('C:/pv.xls');
# $excel->Quit;

グラフの種類はグラフの種類を設定する(ChartTypeプロパティ)に情報があるので、$chart->{ChartType}に目的にあったグラフを選択するとよいでしょう。

実務ではMySQLからデータ取得してたり、分析資料作るのもかったるいのでWordにグラフ埋め込んだりするのもWin32::OLE経由でやってます。怠惰ですよ怠惰。