base64 エンコード/デコード

base64エンコード

$str = "たちあがれ日本"

# 文字列からバイト列 (utf-8) に変換する
$byte = [System.Text.Encoding]::UTF8.GetBytes( $str )

# 文字列からバイト列 (iso-2022-jp) に変換する
# $enc = [System.Text.Encoding]::GetEncoding("iso-2022-jp")
# $byte = $enc.GetBytes( $str )

# バイト列から base64 に変換する
$base64 = [System.Convert]::ToBase64String( $byte )

echo $base64

base64デコード

$base64 = "44Gf44Gh44GC44GM44KM5pel5pys"

# base64 からバイト列に変換する
$byte = [System.Convert]::FromBase64String( $base64 )

# バイト列から文字列 (utf8) に変換する
$str = [System.Text.Encoding]::UTF8.GetString( $byte )

# or
# $enc = [System.Text.Encoding]::GetEncoding("utf-8")
# $str = $enc.GetString( $byte )

# iso-2022-jp
# $enc = [System.Text.Encoding]::GetEncoding("iso-2022-jp")
# $str = $enc.GetString( $byte )

echo $str

POP3でメールを落として、MboxParserでゴニョる

#!/usr/bin/perl

use strict;
use warnings;
use Mail::POP3Client;
use Mail::MboxParser::Mail;

my $user = "username";
my $pass = "password";
my $host = "example.jp";
my $ssl  = 1;

my $pop = new Mail::POP3Client( USER => $user,
                                PASSWORD  => $pass,
                                HOST      => $host,
                                USESSL    => $ssl,
                                DEBUG     => 0,
                                AUTH_MODE => 'PASS' );

for (my $i = 1; $i <= $pop->Count; $i++) {
    my $msg = Mail::MboxParser::Mail->new( [ $pop->Head($i) ],
                                           [ $pop->Body($i) ] );
    print $msg->header->{subject}, "\n";
#    $pop->Delete($i);
}

$pop->Close();

パスワードがブレーンのときは AUTH_MODE を PASS にする。あとは、http://d.hatena.ne.jp/chabom/20100617/1279259115 のようにメッセージをほげる。

printf で揃える

#!/usr/bin/perl

use strict;
use warnings;

my @host = (
    { 'hostname' => "host1",
      'size'     => 613475,
      'used'     => 16551 },
    { 'hostname' => "host2",
      'size'     => 613501,
      'used'     => 15214 },
);

printf "%-5s %8s %8s %8s %4s\n", "Host", "Size", "Used", "Avail", "Use%";

foreach (@host) {
    printf "%-5s %7dM %7dM %7dM %3d%%\n",
        $_->{hostname},
        $_->{size}, $_->{used},
        $_->{size} - $_->{used},
        $_->{used} / $_->{size} * 100;
}
$ ./printf.pl
Host      Size     Used    Avail Use%
host1  613475M   16551M  596924M   2%
host2  613501M   15214M  598287M   2%

mbox形式からメール本文と添付ファイルを抜く

#!/usr/bin/perl

use strict;
use warnings;
use Mail::MboxParser;
use DateTime::Format::Mail;

my $mbox = $ARGV[0];
die unless ($mbox);

my $mb = Mail::MboxParser->new($mbox,
                               decode     => 'ALL',
                               parseropts => {
                                   enable_cache    => 1,
                                   cache_file_name => 'cache-file',
                               });

my $i = 1;
for my $msg ($mb->get_messages) {
    my ($subject, $date, $dt, $prefix);

    $subject = $msg->header->{subject};
    $date    = $msg->header->{date};

    $dt = DateTime::Format::Mail->parse_datetime($date);
    $date = $dt->ymd("");

    # 日付のディレクトリ作成
    mkdir "./$date" unless (-d "./$date");

    $prefix = sprintf("%02d", $i);
    
    # body を保存する
    open my $fh, '>', "./$date/${prefix}.txt" or die $!;
    $msg->store_entity_body(0, handle => \*$fh);
    close $fh;

    # 添付ファイルを保存する
    if ($msg->get_attachments) {
        $msg->store_all_attachments(path => "./$date", prefix => "${prefix}_");
    }

    $i++;
}
$ ./parse-mbox.pl mbox
$ ls -F
20100615/  20100616/  20100617/

日付文字列の変換

DateTime::Format::Mail

#!/usr/bin/perl

use strict;
use warnings;
use DateTime::Format::Mail;

my $date = "Thu, 17 Jun 2010 00:00:35 +0900";

my $dt = DateTime::Format::Mail->parse_datetime($date);
print $dt->ymd(""), "\n";
$ ./rfc2822date.pl
20100617

DateTime::Format::Strptime

#!/usr/bin/perl

use strict;
use warnings;
use DateTime::Format::Strptime;

my $date = "Jun 17, 2010";

my $strp = DateTime::Format::Strptime->new(pattern => "%b %d, %Y");
my $dt = $strp->parse_datetime($date);
print $dt->ymd(""), "\n";
$ ./strptime.pl
20100617

バッチでコミットする

#!/bin/sh

# 毎日の統計をsubversionリポジトリにコミットする

date=`date '+%Y%m%d'`

cd /home/turbo/log
/home/turbo/stat.pl > stat.txt

svn ci -m "update $date"
svn up

で、cronに仕込むと。

$ crontab -e
0 2 * * * /home/turbo/stat.sh

改行の削除

open my $fh, '<', $file or die $!;
while (<$fh>) {
#  chomp;
  s/\r?\n$//; # 0D0Aのときがあったので
  push @list, $_ unless /^$/;
}
close $fh;

レコード区切り文字 $/ を設定して chomp してもいいのだが、Windows だと 0D0A、Linux だと 0A となり、ファイルがどこで作られるかまちまちのため。

参考