safari4ベータが出たので、safariのリダイレクトエラーで書いた現象をWindows版で確認してみた。
[Perl]Mooseで携帯キャリア判定モジュール
自作の携帯サイト用アクセス解析ソフト「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
[Perl]アクセスログ解析に最低限必要なモジュール
アクセスログ解析を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人プログラマください・・・)
[PHP]Cannot modify header information
とある理由からheader関数で他のページにリダイレクトする処理を追加する必要があったんだけど、同じページをrequire_onceしているにも関わらず、アクセスするページによってリダイレクトされたり、以下のようなエラーが表示された。
Warning: Cannot modify header information - headers already sent by (output started at /foo/bar/hoge.php:2937) in /foo/bar/index.php on line 11
よくよくエラーを見たらindex.phpが呼び出しているhoge.phpの最後が
?> // ここに改行が入ってた
のように無駄な改行がされていたため、headerを送出できなかったっぽい。
PHPのデリミタの前後には何も書いちゃいけません。
[php]
...
?>
[/php]
呼び出されているhoge.phpは実際はSmartyのモジュールでした。71ファイル全てが改行されてたので全部修正してなんとかなった。
ケータイ動作検証ロボ
ケータイWebサイトの動作検証は端末固有の動作などがあるため、必ず実機を使った検証を行うべきですが、それなりにちゃんとした会社だと、各種端末を取り揃えた検証センターなどに予約し、現地に赴いて検証していると思います。
メンドクサイですよね。時間も限られているし。
誰かWebカメラ搭載してて、ケータイ実機のボタンを押す機能があるロボットを作ってくれませんか?
こういうロボットが検証センター側にあれば、Webアプリでボタンを押すと、ネットワーク経由でロボットがボタンを押してくれて、実機の画面をストリーム配信してくれるってのができそうなんですが。
検証センターに行きたくねーーーーんだよ。