warning: Creating default object from empty value in /var/www/drupal-5.23/modules/taxonomy/taxonomy.module on line 1418.

Perl で、RADIUS クライアントを作る。

Radius サーバに接続するためには、そのホスト名とシークレットが必要である。シークレットは Radius サーバへのパスワードみたいなもの。以下のコードでは $r に Radius クライアントのオブジェクトが入り、その後で $USENAME と $PASSWORD を使って $HOST にアクセスしている。 使用するモジュール use Authen::Radius;
#!/usr/bin/perl

use Authen::Radius;

our $HOST     = '1.1.1.1';
our $USERNAME = 'perltips';
our $PASSWORD = 'password';
our $SECRET   = 'testing123';

# First Trial
$r = new Authen::Radius(Host   => $HOST,
                        Secret => $SECRET,
                        Debug  => 1,
                        TimeOut=> 10);

# 前座。ユーザー名とパスワードのチェックをしてみる。
print "auth result=", $r->check_pwd($USERNAME,
                                    $PASSWORD,
                                    $HOST), "\n";
# Authen::Radius->load_dictionary();

# 本番。ユーザー名とパスワードのチェックを設定する。
$r->add_attributes (
                { Name => 'UserName',       Value => $USERNAME },
                { Name => 'Password',       Value => $PASSWORD },
#               { Name => 'NAS-IP-Address', Value => '1.1.1.2' }
#
# RFC 2865 https://www.ietf.org/rfc/rfc2865.txt calls this attribute
# User-Password. Check your local RADIUS dictionary to find
);

# ユーザー名とパスワードの組み合わせ (アトリビュート:属性) を、ACCESS_REQUEST で送る。
# そうすると返事が返って来るので recv_packet で受け取る。
$r->send_packet(ACCESS_REQUEST) and $type = $r->recv_packet();
print "server response type = $type\n";

# サーバから送られてきたアトリビュートを表示してみる。
for $a ($r->get_attributes()) {
        print "attr: name=$a->{'Name'} value=$a->{'Value'}\n";
}
Radius サーバに接続するためには、そのホスト名とシークレットが必要である。シークレットは Radius サーバへのパスワードみたいなもの。以下のコードでは $r に Radius クライアントのオブジェクトが入り、その後で $USENAME と $PASSWORD を使って $HOST にアクセスしている。 使用するモジュール use Authen::Radius;
#!/usr/bin/perl

use Authen::Radius;

our $HOST     = '1.1.1.1';
our $USERNAME = 'perltips';
our $PASSWORD = 'password';
our $SECRET   = 'testing123';

# First Trial
$r = new Authen::Radius(Host   => $HOST,
                        Secret => $SECRET,
                        Debug  => 1,
                        TimeOut=> 10);

# 前座。ユーザー名とパスワードのチェックをしてみる。
print "auth result=", $r->check_pwd($USERNAME,
                                    $PASSWORD,
                                    $HOST), "\n";
# Authen::Radius->load_dictionary();

# 本番。ユーザー名とパスワードのチェックを設定する。
$r->add_attributes (
                { Name => 'UserName',       Value => $USERNAME },
                { Name => 'Password',       Value => $PASSWORD },
#               { Name => 'NAS-IP-Address', Value => '1.1.1.2' }
#
# RFC 2865 https://www.ietf.org/rfc/rfc2865.txt calls this attribute
# User-Password. Check your local RADIUS dictionary to find
);

# ユーザー名とパスワードの組み合わせ (アトリビュート:属性) を、ACCESS_REQUEST で送る。
# そうすると返事が返って来るので recv_packet で受け取る。
$r->send_packet(ACCESS_REQUEST) and $type = $r->recv_packet();
print "server response type = $type\n";

# サーバから送られてきたアトリビュートを表示してみる。
for $a ($r->get_attributes()) {
        print "attr: name=$a->{'Name'} value=$a->{'Value'}\n";
}

Perl で、角丸画像を作成する。

オンラインで角丸画像を作成することができます。画像をアップロードすると、サーバ側で角丸画像が生成されてブラウザに表示されます。利用できるフォーマットは、JPEG、PNG、BMP です。 角丸み度の半径(ピクセル) : 角丸のアンチエイリアス : する しない 角丸の部分の背景色 : 角丸する画像ファイル :  
オンラインで角丸画像を作成することができます。画像をアップロードすると、サーバ側で角丸画像が生成されてブラウザに表示されます。利用できるフォーマットは、JPEG、PNG、BMP です。 角丸み度の半径(ピクセル) : 角丸のアンチエイリアス : する しない 角丸の部分の背景色 : 角丸する画像ファイル :  

Perl で、サーバにインストールされているモジュールのバージョンをチェックする方法

例えば、モジュール CGI のバージョンを調べたい場合は、以下のようにする。
$ perl -MCGI -e 'print $CGI::VERSION'
例えば、モジュール CGI のバージョンを調べたい場合は、以下のようにする。
$ perl -MCGI -e 'print $CGI::VERSION'

Perl で、メールのサブジェクト (Subject) を文字化けしないで送信するには?

メール送信時に日本語をサブジェクトに書いて送るには、この部分は Base64 にエンコードした JIS でなければならない。要は、見た目が Subject: =?ISO-2022-JP?B?GyRCJTUlViU4JSclLyVIJE4lRiU5JUgkRyQ5GyhC?= のようにBase64 でエンコードされていることである。 それでは Perl でサブジェクトを Base64 処理してメールを送るにはどうしたらいいだろう?ズバリ、「Base64エンコード・デコードする」が詳しい。より具体的には、リンク先のページを少し下にいったところの、add_econde_word という関数である。しかしこのモジュールは jcode.pl を使う。 Perl 5.8 以上であれば、use Encode; とできそうだが、このモジュール、個人的にはあまり完成度が高くないと思っている。完成度なら Unicode::Japanese の方がスマートだし使いやすい。従って以下にjcode.pl の部分を、Unicode::Japanese で置き換えた例を示す。 使用するクラス use Unicode::Japanese; use MIME::Base64;
#!/usr/bin/perl

use Unicode::Japanese;
use MIME::Base64;

sub add_encode_word {

    my($str, $line) = @_;
    my $result;

    my $ascii = '[\x00-\x7F]';
    my $twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
    my $threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';

    # この次の while 以下は EUC の文字列を対象に処理することになっているため
    $str = Unicode::Japanese->new($str, 'auto')->euc;

    while (length($str)) {
        my $target = $str;
        $str = '';
        if (length($line) + 22 + ($target =~ /^(?:$twoBytes|$threeBytes)/o) * 8
            > 76) {

            $line =~ s/[ \t\n\r]*$/\n/;
            $result .= $line;
            $line = ' ';
        }

        while (1) {

            # EUC を JIS に直す
            $target = Unicode::Japanese->new($target, 'euc')->jis;

            my $encoded = '=?ISO-2022-JP?B?' .
            encode_base64($target, '') . '?=';
            if (length($encoded) + length($line) > 76) {
                $target =~ s/($threeBytes|$twoBytes|$ascii)$//o;
                $str = $1 . $str;
            } else {
                $line .= $encoded;
                last;
            }
        }
    }
    $result . $line;
}

print add_encode_word('サブジェクトのテストです', 'Subject: ');

1;
これを実行すると、以下の文字列が得られる。 Subject: =?ISO-2022-JP?B?GyRCJTUlViU4JSclLyVIJE4lRiU5JUgkRyQ5GyhC?= わざわざ Subject: というヘッダを含めて add_encode_word 関数に渡している理由は、メールの場合は Subject: ヘッダに日本語が来る場合、Base64 でエンコードするにしても 1行は 76バイト以内と決まっているためで、この 1行とは、ヘッダ名の Subject: 自体の文字数(9バイト)を勘案する必要があるためだ。
メール送信時に日本語をサブジェクトに書いて送るには、この部分は Base64 にエンコードした JIS でなければならない。要は、見た目が Subject: =?ISO-2022-JP?B?GyRCJTUlViU4JSclLyVIJE4lRiU5JUgkRyQ5GyhC?= のようにBase64 でエンコードされていることである。 それでは Perl でサブジェクトを Base64 処理してメールを送るにはどうしたらいいだろう?ズバリ、「Base64エンコード・デコードする」が詳しい。より具体的には、リンク先のページを少し下にいったところの、add_econde_word という関数である。しかしこのモジュールは jcode.pl を使う。 Perl 5.8 以上であれば、use Encode; とできそうだが、このモジュール、個人的にはあまり完成度が高くないと思っている。完成度なら Unicode::Japanese の方がスマートだし使いやすい。従って以下にjcode.pl の部分を、Unicode::Japanese で置き換えた例を示す。 使用するクラス use Unicode::Japanese; use MIME::Base64;
#!/usr/bin/perl

use Unicode::Japanese;
use MIME::Base64;

sub add_encode_word {

    my($str, $line) = @_;
    my $result;

    my $ascii = '[\x00-\x7F]';
    my $twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
    my $threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';

    # この次の while 以下は EUC の文字列を対象に処理することになっているため
    $str = Unicode::Japanese->new($str, 'auto')->euc;

    while (length($str)) {
        my $target = $str;
        $str = '';
        if (length($line) + 22 + ($target =~ /^(?:$twoBytes|$threeBytes)/o) * 8
            > 76) {

            $line =~ s/[ \t\n\r]*$/\n/;
            $result .= $line;
            $line = ' ';
        }

        while (1) {

            # EUC を JIS に直す
            $target = Unicode::Japanese->new($target, 'euc')->jis;

            my $encoded = '=?ISO-2022-JP?B?' .
            encode_base64($target, '') . '?=';
            if (length($encoded) + length($line) > 76) {
                $target =~ s/($threeBytes|$twoBytes|$ascii)$//o;
                $str = $1 . $str;
            } else {
                $line .= $encoded;
                last;
            }
        }
    }
    $result . $line;
}

print add_encode_word('サブジェクトのテストです', 'Subject: ');

1;
これを実行すると、以下の文字列が得られる。 Subject: =?ISO-2022-JP?B?GyRCJTUlViU4JSclLyVIJE4lRiU5JUgkRyQ5GyhC?= わざわざ Subject: というヘッダを含めて add_encode_word 関数に渡している理由は、メールの場合は Subject: ヘッダに日本語が来る場合、Base64 でエンコードするにしても 1行は 76バイト以内と決まっているためで、この 1行とは、ヘッダ名の Subject: 自体の文字数(9バイト)を勘案する必要があるためだ。