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

Posted on 10th 4月 2009 in Perl, Web, Windows, ソフトウェア, プログラム
サンプルグラフ

サンプルグラフ

アクセス解析の専用ソフトなんて高くて買ってもらえないので、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経由でやってます。怠惰ですよ怠惰。

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加

[Perl]Mooseで携帯キャリア判定モジュール

Posted on 24th 2月 2009 in Perl, Web, ソフトウェア, プログラム, モバイル

自作の携帯サイト用アクセス解析ソフト「Episode」の携帯キャリア判定モジュールをMooseでリファクタリングしてみた。色々改善の余地があるコードだけどとりあえず動くので良しとする。

HashRef[Str]型のdefaultの指定方法にめっちゃ苦労した。default = {a=>’a'}ってできなくて、無名サブルーチン使わなきゃいけないらしい。

MooseX::AttributeHelpersを組み込めば、この辺が楽になるのかね?

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
package Episode::Request::UserAgent;
use Moose;
use Perl6::Say;
 
has 'useragent' => (
    is  => 'rw',
    isa => 'Str',
    default => '',
    required => 1,
);
 
 
has 'regex' => (
    is  => 'ro',
    isa => 'HashRef[Str]',
    default => sub {
        {
            docomo   => '^DoCoMo',
            au       => '^(?:KDDI|UP\.Browser\/.+?)-(.+?) ',
            softbank => '^(?:SoftBank|Semulator)',
        }
    },
    required => 1,
);
 
 
__PACKAGE__->meta->make_immutable;
no Moose;
 
sub is_mobile {
    my $self = shift;
    $self->useragent =~ $self->regex->{docomo} ||
    $self->useragent =~ $self->regex->{au} ||
    $self->useragent =~ $self->regex->{softbank}
    ? 1 : 0;
}
 
sub AUTOLOAD {
    my $self = shift;
    our $AUTOLOAD;
    my $pkg = __PACKAGE__ . '::is_';
    $AUTOLOAD =~ s/$pkg//;
    my $regex = $self->regex->{$AUTOLOAD};
    $self->useragent =~ m|$regex| ? 1 : 0;
}
1;
 
my $ua = 'KDDI-HI31 UP.Browser/6.2.0.5 (GUI) MMP/2.0';
my $req = new Episode::Request::UserAgent;
$req->useragent($ua);
say 'mobile? : ',   $req->is_mobile;
say 'docomo? : ',   $req->is_docomo;
say 'au? : ',       $req->is_au;
say 'softbank? : ', $req->is_softbank;

結果

mobile? : 1
docomo? : 0
au? : 1
softbank? : 0
このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加

[Java]IISログの時間を日本時間にする

Posted on 23rd 2月 2009 in Java, Web, Windows, ソフトウェア, プログラム

こんな感じでいいのだろうか。拡張性は一切考慮しなかった。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.*;
import java.text.*;
 
public class IISLog {
 
    private static final DateFormat FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
    public static String JST(String time) throws ParseException {
        Date date = FORMAT.parse(time);
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.HOUR, 9);
        return FORMAT.format(cal.getTime());
    }
 
    public static void main(String[] args) {
        try {
            System.out.println(IISLog.JST("2008-08-27 23:00:00"));
        } catch (ParseException ex) {
            ex.printStackTrace();
        }
    }
}
このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加

[Perl]アクセスログ解析に最低限必要なモジュール

Posted on 13th 2月 2009 in Perl, Web, プログラム

アクセスログ解析をPerlで行う場合に最低限必要な(使っている)モジュールを列挙してみた。
基本的にツールレベルなら軽量モジュールを使うけど、これでできない事があれば上位のモジュールを使ってもいい。

1
2
3
4
5
6
use strict; # お約束
use warnings; # お約束
use CGI::Lite; # 検索ワードのデコードに使う
use DBIx::Simple; # ログそのものや集計結果をDBに登録する
use Encode; # 文字コード変換
use Text::CSV::Simple; # CSVファイルをまともにパースする

まったく同様の機能をJavaで書いてみたけど解析そのものは4倍くらい速かった。
ただJavaだと思い立ったらツール作成→実行ができないので、DB関連の所だけInline::Javaで呼び出すって方法がいいのかもしれない。
(やると誰もメンテナンスできなくなるのが難点。もう1人プログラマください・・・)

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加

Flash Lite対応状況を調べた

Posted on 27th 1月 2009 in Web, モバイル

3キャリア公式サイトの会員専用ページにアクセスした端末のFlash Lite対応状況を調査した。

ドコモ:95%
au:85%
ソフトバンクモバイル:65%
全体:83%

ソフトバンクはキャリア変遷があったからFlash Lite端末が少ない。リッチコンテンツ化を進めてもよいものだろうか。

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加