みなさんの会社では裏紙を使っていますか?
裏紙使うことの是非はともかく [www.itmedia.co.jp]、環境コンサルに相談すると「裏紙使わないのが許されるのは小学生までだよね」、とか言われるようですので、言われてしまったからには素直に裏紙使いましょう。
それで、裏紙を使うだけではなくて、実際に使った量を測定しないと環境活動にならないわけですけれども、プリンタに通した紙の枚数のチェック、いわゆるメーター確認をしないと、効果測定の計算ができず、会議で報告できないですよね。
というわけで、メーター確認をしてくれるPerlスクリプトです。
スクリプトの内容
最近のプリンタは、Webサーバを内蔵しているものが多く、ブラウザからアクセスして、特定のページにアクセスすると、メーター確認ができるようになっています。そこで、そのページをPerlのLWP::Simpleという一番簡単なアクセス手段を使って丸ごと引っ張ってきて、正規表現で、カウンタ数値を取得、表示します。
というわけで、これ作るには、プリンタにブラウザでアクセスし、HTML構造をやフレームの構造を解析して、正規表現を作る必要があります。HTMLソース見て自由気ままに作ってください。
今回は、ゼロックスのDocuPrint用です。プリンタのファームウェアのバージョンによって動かない可能性もあるので注意。
ソース
Filename: check_counter.pl (UTF-8です)
#!/usr/bin/perl
#DocuPrint Counter Check
use strict;
use warnings;
use LWP::Simple;
use utf8;
use Encode;
my $printers = [
{
name => 'DocuPrint No.1',
ip => '192.0.2.110',
},
{
name => 'DocuPrint No.2',
ip => '192.0.2.111',
},
];
foreach my $printer ( @$printers ) {
print "$printer->{name}\n";
print "$printer->{ip }\n";
print getDocuPrint_count($printer->{ip})."\n\n";
}
exit;
sub getDocuPrint_count {
my $ip = shift;
my $html = decode( 'cp932', get('http://' . $ip . '/prcnt.htm') );
my $regexp = q(var info=\['総プリントページ数',([\d,]+?)\]);
my $count;
if ( $html =~m|$regexp| ) {
$count = $1;
}
return $count;
}
※実際のIPから例示用IPに書き換えていますので注意
実行結果
今回動作確認はWindowsのActivePerl 5.8.8で行っています。
D:\>check_counter.pl DocuPrint No.1 192.2.0.110 66570 DocuPrint No.2 192.2.0.111 131128 D:\>※実際の表示から例示用IPに書き換えていますので注意
ポイント
プリンタから出てくるHTML文書のcharsetがShift_JISだったので、LWP::SimpleモジュールのgetメソッドでHTML文書を読み込んだあと、キャラクターエンコーディングがCP932であると見なし、use utf8;でutf8プラグマを有効にしたPerlにおいて扱いやすい、UTF-8 flagが上がったUTF-8文字列に変換しちゃっています(decodeっていうところ)。
UTF-8 flagが上がったUTF-8文字列になってしまえば、正規表現で日本語文字列による検索がしやすくなりますので、キャラクターエンコーディングは意識した方がいいというお話でした。
補足
このプログラムをメールで送信するように改造して、cron(UNIXライクなOS)やらAT(Windows)やらで定時実行させるようにすると、いちいちプリンタまで行ってメーター確認しなくてすみますね!
但し、プリンタの電源が付いていないとダメ。これを実行するために常にプリンタの電源を付けておくなどという本末転倒なことは、くれぐれもなさらぬよう。



- my $html = decode( 'cp932', get('http://' . $ip . '/prcnt.htm') );
- my $regexp = q(var info=\['総プリントページ数',([\d,]+?)\]);
+ my $html = decode( 'cp932', get("http://$ip/prcnt.htm") );
+ my $regexp = qr/var info=\['総プリントページ数',([\d,]+?)\]/;
-if ( $html =~m|$regexp| ) {
+if ( $html =~ $regexp ) {
regexpが定数ならqr{}で作っとけば軽い。