CentOS5.5でyum一括アップデートしたらPerlがCompress::Zlibでコケるようになった

昨日、yum一括更新を行ったのですが、その後でどうもクローラが正常に機能しなくなりました。
ログを見てみると、Compress::Zlibで以下のようなエラーを吐いていることを確認。(コピペでなくて入力なのでタイポあるかも)

dualvar is only available with the XS version of  Scalar::Util at /usr/perl5/lib/site_perl/5.8.8/Compress/Zlib.pm line 9


つまりはScalar::Utilのせいで動かないらしいです。
そこでCPANからScalar::UtilをiinstallしようとしてもNOT OKになってしまうので、とりあえず

force install Scalar::Utilde


でしのぐことに。
おそるおそるクローラを起動するとエラーを吐かずに正常に機能するようになりました。
でめたしでめたし。

PerlのNet::Twitterモジュールがインストールできない

Perlでtwitterに何かをやらかすにはNet::Twitterというモジュールを利用するといいようです。
早速Net::Twitterを入れてみることにしました。
ちなみに、WindowsVistaはActivePerl 5.8.8です。
ppmでは用意されていないので、CPANからインストールします。
しかし、実際に実行してみると、いろいろ足らないからインストールしますよといわれて、言うとおりにインストールしたのですが、あちこちでNOT OKとなってしまいます。

C:\Users\admin>cpan install Net::Twitter
CPAN: Storable loaded ok
Going to read C:\Perl\cpan\Metadata
  Database was generated on Thu, 22 Apr 2010 21:26:57 GMT
install is up to date.
Running install for module Net::Twitter
Running make for M/MM/MMIMS/Net-Twitter-3.12000.tar.gz
CPAN: Digest::MD5 loaded ok
CPAN: Compress::Zlib loaded ok
Checksum for C:\Perl\cpan\sources\authors\id\M\MM\MMIMS\Net-Twitter-3.12000.tar.gz ok
Scanning cache C:\Perl/cpan/build for sizes
Deleting from cache: C:\Perl\cpan\build\ExtUtils-MakeMaker-6.56 (17.6>10.0 MB)
Can't remove directory C:\Perl\cpan\build\ExtUtils-MakeMaker-6.56/t/Big-Dummy (Permission denied) at C:/Perl/lib/CPAN.pm line 9
6
Can't remove directory C:\Perl\cpan\build\ExtUtils-MakeMaker-6.56/t (Directory not empty) at C:/Perl/lib/CPAN.pm line 966
Can't remove directory C:\Perl\cpan\build\ExtUtils-MakeMaker-6.56 (Directory not empty) at C:/Perl/lib/CPAN.pm line 966
Deleting from cache: C:\Perl\cpan\build\Net-Twitter-3.12000 (17.6>10.0 MB)
Deleting from cache: C:\Perl\cpan\build\Sub-Name-0.04 (17.0>10.0 MB)
Deleting from cache: C:\Perl\cpan\build\Sub-Identify-0.04 (16.9>10.0 MB)
Deleting from cache: C:\Perl\cpan\build\Variable-Magic-0.41 (16.7>10.0 MB)
Deleting from cache: C:\Perl\cpan\build\B-Hooks-EndOfScope-0.08 (16.5>10.0 MB)
Deleting from cache: C:\Perl\cpan\build\namespace-clean-0.14 (16.4>10.0 MB)
Deleting from cache: C:\Perl\cpan\build\Scalar-List-Utils-1.23 (16.3>10.0 MB)
Deleting from cache: C:\Perl\cpan\build\Devel-GlobalDestruction-0.02 (16.2>10.0 MB)
Deleting from cache: C:\Perl\cpan\build\Class-MOP-1.00 (16.0>10.0 MB)
Deleting from cache: C:\Perl\cpan\build\Moose-1.01 (15.0>10.0 MB)
Deleting from cache: C:\Perl\cpan\build\Data-Visitor-0.27 (12.5>10.0 MB)
Deleting from cache: C:\Perl\cpan\build\DateTime-0.55 (12.4>10.0 MB)
Deleting from cache: C:\Perl\cpan\build\DateTime-Format-Strptime-1.2000 (11.6>10.0 MB)
Deleting from cache: C:\Perl\cpan\build\MooseX-MultiInitArg-0.01 (11.4>10.0 MB)
Deleting from cache: C:\Perl\cpan\build\namespace-autoclean-0.09 (11.4>10.0 MB)
Deleting from cache: C:\Perl\cpan\build\Digest-SHA1-2.12 (11.3>10.0 MB)
Deleting from cache: C:\Perl\cpan\build\Encode-2.39 (11.2>10.0 MB)
CPAN: Archive::Tar loaded ok
Net-Twitter-3.12000/
Net-Twitter-3.12000/lib/
Net-Twitter-3.12000/lib/Net/
Net-Twitter-3.12000/lib/Net/Identica.pm
Net-Twitter-3.12000/lib/Net/Twitter.pm
Net-Twitter-3.12000/lib/Net/Twitter/
Net-Twitter-3.12000/lib/Net/Twitter/Role/
Net-Twitter-3.12000/lib/Net/Twitter/Role/WrapError.pm
Net-Twitter-3.12000/lib/Net/Twitter/Role/Legacy.pm
Net-Twitter-3.12000/lib/Net/Twitter/Role/API/
Net-Twitter-3.12000/lib/Net/Twitter/Role/API/Search.pm
Net-Twitter-3.12000/lib/Net/Twitter/Role/API/TwitterVision.pm
Net-Twitter-3.12000/lib/Net/Twitter/Role/API/REST.pm
Net-Twitter-3.12000/lib/Net/Twitter/Role/API/Lists.pm
Net-Twitter-3.12000/lib/Net/Twitter/Role/OAuth.pm
Net-Twitter-3.12000/lib/Net/Twitter/Role/RetryOnError.pm
Net-Twitter-3.12000/lib/Net/Twitter/Role/RateLimit.pm
Net-Twitter-3.12000/lib/Net/Twitter/Role/SimulateCursors.pm
Net-Twitter-3.12000/lib/Net/Twitter/Role/InflateObjects.pm
Net-Twitter-3.12000/lib/Net/Twitter/OAuth/
Net-Twitter-3.12000/lib/Net/Twitter/OAuth/XAuthRequest.pm
Net-Twitter-3.12000/lib/Net/Twitter/API.pm
Net-Twitter-3.12000/lib/Net/Twitter/Search.pm
Net-Twitter-3.12000/lib/Net/Twitter/Core.pm
Net-Twitter-3.12000/lib/Net/Twitter/OAuth.pm
Net-Twitter-3.12000/lib/Net/Twitter/Error.pm
Net-Twitter-3.12000/lib/Net/Twitter.pod
Net-Twitter-3.12000/Changes
Net-Twitter-3.12000/MANIFEST
Net-Twitter-3.12000/examples/
Net-Twitter-3.12000/examples/oauth_webapp.pl
Net-Twitter-3.12000/examples/oauth_desktop.pl
Net-Twitter-3.12000/README
Net-Twitter-3.12000/src/
Net-Twitter-3.12000/src/net-twitter-pod.tt2
Net-Twitter-3.12000/src/build.pl
Net-Twitter-3.12000/t/
Net-Twitter-3.12000/t/22_twitter_insanity.t
Net-Twitter-3.12000/t/20_exceptions.t
Net-Twitter-3.12000/t/unicode.t
Net-Twitter-3.12000/t/lib/
Net-Twitter-3.12000/t/lib/TestUA.pm
Net-Twitter-3.12000/t/13_search.t
Net-Twitter-3.12000/t/99-pod_syntax.t
Net-Twitter-3.12000/t/02_fails.t
Net-Twitter-3.12000/t/51_rate_limit.t
Net-Twitter-3.12000/t/40_nt_subclasses.t
Net-Twitter-3.12000/t/11_useragent.t
Net-Twitter-3.12000/t/50_inflate_objects.t
Net-Twitter-3.12000/t/99-pod_coverage.t
Net-Twitter-3.12000/t/21_wraperror.t
Net-Twitter-3.12000/t/10_net-twitter-regression.t
Net-Twitter-3.12000/t/12_identica.t
Net-Twitter-3.12000/t/01_basic.t
Net-Twitter-3.12000/t/60-api_lists.t
Net-Twitter-3.12000/t/retry.t
Net-Twitter-3.12000/t/geo.t
Net-Twitter-3.12000/t/51_since.t
Net-Twitter-3.12000/t/00_load.t
Net-Twitter-3.12000/t/14_authenticate.t
Net-Twitter-3.12000/t/30_legacy.t
Net-Twitter-3.12000/t/20_generated.t
Net-Twitter-3.12000/t/15_subclass.t
Net-Twitter-3.12000/t/99-pod_spelling.t
Net-Twitter-3.12000/t/lookup_users.t
Net-Twitter-3.12000/META.yml
Net-Twitter-3.12000/Makefile.PL
Net-Twitter-3.12000/inc/
Net-Twitter-3.12000/inc/Module/
Net-Twitter-3.12000/inc/Module/Install.pm
Net-Twitter-3.12000/inc/Module/Install/
Net-Twitter-3.12000/inc/Module/Install/WriteAll.pm
Net-Twitter-3.12000/inc/Module/Install/Fetch.pm
Net-Twitter-3.12000/inc/Module/Install/Win32.pm
Net-Twitter-3.12000/inc/Module/Install/Include.pm
Net-Twitter-3.12000/inc/Module/Install/Repository.pm
Net-Twitter-3.12000/inc/Module/Install/AutoInstall.pm
Net-Twitter-3.12000/inc/Module/Install/Base.pm
Net-Twitter-3.12000/inc/Module/Install/Metadata.pm
Net-Twitter-3.12000/inc/Module/Install/Can.pm
Net-Twitter-3.12000/inc/Module/Install/Makefile.pm
Net-Twitter-3.12000/inc/Module/Install/AutoManifest.pm
Net-Twitter-3.12000/inc/Module/AutoInstall.pm

  CPAN.pm: Going to build M/MM/MMIMS/Net-Twitter-3.12000.tar.gz

*** Module::AutoInstall version 1.03
*** Checking for Perl dependencies...
[Core Features]
- Test::More                 ...loaded. (0.94 >= 0.88)
- Carp                       ...loaded. (1.04)
- Digest::SHA                ...loaded. (5.47)
- List::Util                 ...loaded. (1.18)
- Net::Netrc                 ...loaded. (2.12)
- Scalar::Util               ...loaded. (1.18)
- Data::Visitor::Callback    ...missing.
- DateTime                   ...missing. (would need 0.51)
- DateTime::Format::Strptime ...missing. (would need 1.09)
- Encode                     ...loaded. (2.12)
- HTML::Entities             ...loaded. (1.35)
- HTTP::Request::Common      ...loaded. (1.26)
- JSON::Any                  ...loaded. (1.22 >= 1.21)
- LWP::UserAgent             ...loaded. (2.033 >= 2.032)
- Moose                      ...missing. (would need 0.9)
- Moose::Exporter            ...missing.
- Moose::Role                ...missing.
- MooseX::MultiInitArg       ...missing.
- namespace::autoclean       ...missing. (would need 0.09)
- Net::OAuth                 ...missing. (would need 0.2)
- URI                        ...loaded. (1.52 >= 1.4)
- URI::Escape                ...loaded. (3.29)
- Try::Tiny                  ...loaded. (0.04)
- JSON                       ...loaded. (2.17 >= 2.02)
==> Auto-install the 9 mandatory module(s) from CPAN? [y] 

とりあえずそのままYを押して足らないものを入れさせてみましたが、ぜんぜんだめでした。

ちなみに、CentOS5のPerl5.8.8でも同じような現象に。CPAN自体をアップデートしてやり直してもだめ。yumから1つ1つ入れてみようと思って、まず

yum install perl-Moose

を終えても、CPANからはまた入れなおそうとしてしまいます。
Mooseという新しい技術を利用するのもいいのですが、入れること自体がハードルが高いとあまり意味がないですね。別のOSで試すとか、あきらめるしかないのかなぁ。がっかり。

CentOS5.4でCPANを更新すると警告が大量に出た

えらいことになった。
とりあえずTerm::ReadKeyを入れればいいらしい

[root@localhost ~]# cpan
Sorry, we have to rerun the configuration dialog for CPAN.pm due to
some missing parameters...

Normally CPAN.pm keeps config variables in memory and changes need to
be saved in a separate 'o conf commit' command to make them permanent
between sessions. If you set the 'auto_commit' option to true, changes
to a config variable are always automatically committed to disk.

 
Always commit changes to config variables to disk? [no] 

A Build.PL is run by perl in a separate process. Likewise we run
'./Build' and './Build install' in separate processes. If you have any
parameters you want to pass to the calls, please specify them here.

Typical frequently used settings:

    --install_base /home/xxx             # different installation directory

 
Parameters for the 'perl Build.PL' command? [] 

Parameters for the './Build' command? Setting might be:

    --extra_linker_flags -L/usr/foo/lib  # non-standard library location

 
Your choice: [] 

Do you want to use a different command for './Build install'? Sudo
users will probably prefer:

    su root -c ./Build
 or
    sudo ./Build
 or
    /path1/to/sudo -u admin_account ./Build

 
or some such. Your choice: [./Build] 

Parameters for the './Build install' command? Typical frequently used
setting:

    --uninst 1                           # uninstall conflicting files

 
Your choice: [] 



Please remember to call 'o conf commit' to make the config permanent!

Constant subroutine __USE_POSIX undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 8,  line 5.
Constant subroutine __USE_POSIX2 undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 9,  line 5.
Constant subroutine __USE_POSIX199309 undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 10,  line 5.
Constant subroutine __USE_POSIX199506 undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 11,  line 5.
Constant subroutine __USE_XOPEN undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 12,  line 5.
Constant subroutine __USE_XOPEN_EXTENDED undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 13,  line 5.
Constant subroutine __USE_UNIX98 undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 14,  line 5.
Constant subroutine __USE_LARGEFILE undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 16,  line 5.
Constant subroutine __USE_LARGEFILE64 undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 17,  line 5.
Constant subroutine __USE_FILE_OFFSET64 undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 18,  line 5.
Constant subroutine __USE_BSD undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 19,  line 5.
Constant subroutine __USE_SVID undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 20,  line 5.
Constant subroutine __USE_MISC undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 21,  line 5.
Constant subroutine __USE_GNU undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 23,  line 5.
Constant subroutine __USE_REENTRANT undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 24,  line 5.
Constant subroutine _POSIX_SOURCE undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 49,  line 5.
Constant subroutine _POSIX_C_SOURCE undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 51,  line 5.
Constant subroutine _XOPEN_SOURCE undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 53,  line 5.
Constant subroutine _XOPEN_SOURCE_EXTENDED undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 55,  line 5.
Constant subroutine _LARGEFILE64_SOURCE undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 57,  line 5.
Constant subroutine _LARGEFILE_SOURCE undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 104,  line 5.
Constant subroutine __USE_ISOC99 undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 108,  line 5.
Constant subroutine __GNU_LIBRARY__ undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 156,  line 5.

cpan shell -- CPAN exploration and modules installation (v1.9402)
Enter 'h' for help.

                                                                                Can't ioctl TIOCGETP: 無効な引数です
Consider installing Term::ReadKey from CPAN site nearby
        at http://www.perl.com/CPAN
Or use
        perl -MCPAN -e shell
to reach CPAN. Falling back to 'stty'.
        If you do not want to see this warning, set PERL_READLINE_NOWARN
in your environment.


どうやらTerm::ReadKeyというものが必要なようなので、いれてみる。

cpan[1]> install Term::ReadKey
CPAN: Storable loaded ok (v2.15)
Going to read '/root/.cpan/Metadata'
  Database was generated on Tue, 15 Dec 2009 08:56:54 GMT
Running install for module 'Term::ReadKey'
Running make for J/JS/JSTOWE/TermReadKey-2.30.tar.gz

  CPAN: checksum security checks disabled because Digest::SHA not installed.
  Please consider installing the Digest::SHA module.

CPAN: Time::HiRes loaded ok (v1.9717)
Scanning cache /root/.cpan/build for sizes
............................................................................DONE
CPAN: Compress::Zlib loaded ok (v1.42)
CPAN: Archive::Tar loaded ok (v1.54)
TermReadKey-2.30/
TermReadKey-2.30/genchars.pl
TermReadKey-2.30/Makefile.PL
TermReadKey-2.30/Configure.pm
TermReadKey-2.30/test.pl
TermReadKey-2.30/ReadKey.pm
TermReadKey-2.30/META.yml
TermReadKey-2.30/ReadKey.xs
TermReadKey-2.30/ppport.h
TermReadKey-2.30/MANIFEST
TermReadKey-2.30/README
CPAN: File::Temp loaded ok (v0.22)
CPAN: YAML loaded ok (v0.70)

  CPAN.pm: Going to build J/JS/JSTOWE/TermReadKey-2.30.tar.gz

Checking if your kit is complete...
Looks good
Writing Makefile for Term::ReadKey
cp ReadKey.pm blib/lib/Term/ReadKey.pm
AutoSplitting blib/lib/Term/ReadKey.pm (blib/lib/auto/Term/ReadKey)
/usr/bin/perl -I/usr/lib/perl5/5.8.8 genchars.pl

Writing termio/termios section of cchars.h... Done.
Checking for sgtty...
        Sgtty NOT found.
Writing sgtty section of cchars.h... Done.
/usr/bin/perl /usr/lib/perl5/5.8.8/ExtUtils/xsubpp -noprototypes -typemap /usr/lib/perl5/5.8.8/ExtUtils/typemap  ReadKey.xs > ReadKey.xsc && mv ReadKey.xsc ReadKey.c
gcc -c   -D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables   -DVERSION=\"2.30\" -DXS_VERSION=\"2.30\" -fPIC "-I/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE"   ReadKey.c
/bin/sh: gcc: command not found
make: *** [ReadKey.o] エラー 127
  JSTOWE/TermReadKey-2.30.tar.gz
  /usr/bin/make -- NOT OK
Running make test
  Can't test without successful make
Running make install
  Make had returned bad status, install seems impossible
Failed during this command:
 JSTOWE/TermReadKey-2.30.tar.gz               : make NO


makeに失敗しました。
しかたがないのでyumからいれてみることに

[root@localhost ~]# yum install perl-Term-ReadKey
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * addons: rsync.atworks.co.jp
 * base: rsync.atworks.co.jp
 * extras: rsync.atworks.co.jp
 * updates: rsync.atworks.co.jp
Setting up Install Process
No package perl-Term-ReadKey available.
Nothing to do

orz=3
えっと、あとはどうすればいいんだろう?

Net::Amazonをインストールしてみる

Windowの場合、CPANではNOT OKがでるけど、ppmで簡単に追加できた。

Linux(CentOS)の場合、cpanではNOT OKが大量に出て、個別にモジュールを入れていっても、開発系のライブラリがほとんど入ってないためか、それぞれがNOT OKになってしまう。
結局yumから1つづつ入れていくことになった。
perl-XML-DOM
perl-DIgest-SHA
libxml2
libxml2-devel
Sys-Syslog
perl-Log-Log4perl
んだけど、ログに関するライブラリが入らない。
よくよく見ればCPANの起動時にBundle::CPANを入れろと書いてあるではないか。そういうことならと入れてみる。
何事もなく無事に終了し、Net::Amazonも難なく入った。
結局何が問題なのかって、Bundle::CPANを入れてなかったことだけが問題だったのかもしれない。

Image::Magick::Thumbnail::Simple 0.12 原文

「翻訳」ではなく「原文」なのは、私が作ったモジュールだからです。
Image::Magick::Thumbnail::Simpleモジュールのバージョンは0.12です。

目次

名前

Image::Magick::Thumbnail::Simpleサムネイル画像を無駄なく簡単に作ります

構文

ファイルに出力

use Image::Magick::Thumbnail::Simple;
my $t = new Image::Magick::Thumbnail::Simple;
$t -> thumbnail(
  input  => 'input.jpg',
  output => 'output.jpg',
  size   => 128,
) or die $t -> error;

標準出力に出力

use Image::Magick::Thumbnail::Simple;
my $t = new Image::Magick::Thumbnail::Simple;
binmode STDOUT;
print "Content-type: image/jpegnn";
$t -> thumbnail(
  input  => 'input.jpg',
  output => 'jpg:-',
  size   => 128,
) or die $t -> error;

初期化のときに指定する場合

別に指定しないかぎり、以降全てに継承されます。


$t = new Image::Magick::Thumbnail::Simple(
  size    => 128,
  blur    => 0.8,
  quality => 80,
);

変更する場合

$t -> size( 128 );
$t -> blur( 0.8 );
$t -> quality( 80 );

個別に指定する場合

入力と出力は、個別にしか指定できません。


$t -> thumbnail(
  input   => 'input,jpg',
  output  => 'output.jpg',
  size    => 128,
  blur    => 0.8,
  quality => 80,
);

サムネイル画像の横幅

$width = $t -> width;

サムネイル画像の縦幅

$height = $t -> height;

説明

Image::Magickを使って、簡単にサムネイル画像を作成できます。
基本的な設定はImage::Magickと同じです。画像のリサイズの処理のみを扱います。
公開したバージョンは0.10です。
0.12では、説明の修正と、サムネイルのサイズを返すようになりました。

参照

Image::Magick

作者

Satoshi Ishikawa <cpan@penlabo.net>

Copyright (C) 2008 Satoshi Ishikawa

このライブラリはフリーソフトウェアです。
Perl自体と同じ条件で再配付、または変更することができます。
利用可能なPerlのバージョンは5.8.8、またはこれ以降のバージョンです。

更新履歴

2008-04-03
公開

HTML::AA 0.10 原文

「翻訳」ではなく「原文」なのは、私が作ったモジュールだからです。
HTML::AAモジュールのバージョンは0.10です。
なお、perlmanの内容とは異なります。次期バージョン(UTF-8対応予定)であわせます。
コードの説明は、PHPのHTML/AAパッケージの方が詳しいです。
構文はほぼ同じなので読み替えてください。

モジュールのバグについて

以下のような指摘を頂きましたので掲載しておきます。(2010-02-17記)

#  名無しさん Says:
2月 17th, 2010 at 2:49 PM e

エントリとは関係ないですが、バグ報告です。
PerlのHTML::AAにおいて、文字の0を数字とみなすことによって
エラーが発生します。
270 my @array;
271 while($str) {
272 $str =~ s/(.)//;

を

270 my @array;
271 while($str ne ”) {
272 $str =~ s/(.)//;
にするとうまくいきましたので、ご報告まで。

説明

HTML::AAPerlモジュールです。
AAアスキーアート(Ascii Art)と同じ要領で、アスキーアジャスト(Ascii Adjust)を行います。
このモジュールは、ブラウザに表示する文字列を整形する機能を有します。
アスキーアートほどの表現力はありませんが、文字列の横ピクセル数を計算したり、面倒な右揃え等の整形をすることが出来ます。
このモジュールは、UnitedDevicesの日報支援サイト「UD-Team2ch 404」を作ったことがきっかけです。
UTF-8への対応も予定しておりますので、しばらくお待ちください。
ご意見、ご感想は、モジュール内に記載されているメールアドレスまでお寄せください。
元はWWW::AAとして公開しておりましたが、カテゴリが違うという判断から0.10よりHTML::AAに変更いたしました。

特徴

罫線表示が必要な場合に有効な、指定サイズ(罫線の倍数)の倍数での最小サイズを求めるshorter_multipleを実装しています。

注意

エンコードはEUC-JP、Shift_JISに対応しています。
作者は英語が全然出来ないので、翻訳ソフトにかけた英文で記述されています。
解説は、このページが一番詳しく、判りやすいと思います。
文字コードが異なる場合には、正常な結果を得ることができません。
MS Pゴシック12ポイントで表示した場合に限り、正常に表示できると予想されます。
文字列の先頭に半角スペースが出力された場合、それが行頭になるとずれる現象が発生します。
詳しくは、アスキーアートを紹介しているサイト等を参考にしてください。
原則、日本語の文字(概ね2バイト文字)のみの入力においてのみ正常な動作を保証いたしますが、半角スペース以外は正常に動作することを確認しています。
文字列内に半角スペースの連続が混入している場合、表示の際にずれます。対策処理を検討中。

解説

アスキーコードで正規表現を利用していますが、主要な部分は次の通りです。
判別しやすいように、文字のままで表記しています。
これは、プロトタイプとしてJavaScriptで作成したものを少し修正したものです。

my $str  = shift;
my $count = 0;
$count += 15 * ($str =~ s/ー|M|m|あ|い|お|け|す|そ|ぞ|た|だ|つ|づ|に|ひ|び|ぴ|ん|ウ|オ|ガ|キ|ギ|グ|ケ|ゲ|ズ|セ|ダ|チ|ヂ|ヅ|デ|ナ|ニ|ネ|ヘ|ベ|ペ|ホ|ボ|ポ|ユ|ワ|ヴ//g);
$count += 14 * ($str =~ s/え|き|ぎ|ご|ざ|ち|ぢ|て|で|ど|な|ま|ゃ|ゅ|よ|る|ろ|ゎ|を|ア|エ|ゴ|シ|ジ|ス|ゾ|ツ|テ|ビ|ピ|ブ|プ|マ|モ|レ|ロ|ン//g);
$count += 13 * ($str =~ s/O|Q|ぃ|ぉ|ぐ|こ|っ|も|ら|イ|ォ|カ|ク|コ|ソ|ヌ|フ|ャ|ュ|ラ|ヲ//g);
$count += 12 * ($str =~ s/M|W|m|ヽ|ヾ|ゝ|B|C|D|G|H|K|N|R|S|U|w|ぁ|ぇ|さ|し|じ|と|ょ|り|ァ|ゥ|ェ|タ|ッ|ヒ|メ|ヨ|リ|ヮ|ヵ|ヶ//g);
$count += 11 * ($str =~ s/@|C|G|O|Q|サ|ム|ヤ|ル|、|。|,|.|ゞ|0|1|2|3|4|5|6|7|8|9|A|E|P|V|う|ド|ノ|ミ| //g);# ←最後に全角スペースがあります
$count += 10 * ($str =~ s/&|A|B|D|H|K|N|P|R|S|U|V|X|w|ー|ア|ウ|エ|オ|キ|ケ|ス|セ|チ|ツ|テ|ナ|ニ|ネ|ハ|ヘ|ホ|マ|モ|ユ|F|J|L|T|X|Y|Z|b|d|h|k|n|o|p|q|u|ぅ|ィ|ト|ョ//g);
$count +=  9 * ($str =~ s/E|F|J|L|T|Y|Z|a|c|e|g|s|く|ヲ|イ|カ|ク|コ|シ|ソ|タ|ヌ|フ|ラ|レ|ロ|ワ|ン//g);
$count +=  8 * ($str =~ s/a|b|c|d|e|h|n|o|p|q|u|v|y|"|#|$|%|*|+|-|/|0|1|2|3|4|5|6|7|8|9|<|=|>|\|ァ|ゥ|ェ|ォ|ャ|ュ|ッ|ノ|ヒ|メ|ヨ|リ|・|:|;|゛|゜|´|`|¨|^|‐|‘|’|“|”|(|)|〔|〕|[|]|{|}|〈|〉|《|》|「|」|『|』|【|】|†|‡|¶|v|x|y|z//g);
$count +=  7 * ($str =~ s/?|^|`|g|k|s|x|z|~|「|」|・|ィ|ョ|ト|ミ|。|、//g);
$count +=  6 * ($str =~ s/r|t|r//g);
$count +=  5 * ($str =~ s/(|)|[|]|_|f|f|t| //g);# ←最後に半角スペースがあります
$count +=  4 * ($str =~ s/!|I|j|{|||}|゙|゚|I|i|j|l//g);
$count +=  3 * ($str =~ s/'|,|.|:|;|i|l//g);
$count += 16 * ($str =~ s/../g);
return $count;

文字とそのドット数(ピクセル数)の関連性は、「アスキーアート」で検索したページで、解説が見つかると思います。

使い方(EUC-JPの場合)

use HTML::AA;
my $aart = new HTML::AA;
#------------------- モジュールが処理をする文字コードを指定します。EUC-JPならuec、Shift_JISならsjis
$aart -> code('euc');
my $dot;
my $str = '整形したい文字列です。';
my @str = ('整形したい文字列です。','このような感じで整形することが出来ます。');
print  qq|Content-type: text/html; charset=EUC-JPnn|;
print  qq|<body>n|;
print  qq|HTML::AAのサンプルです。<br>n|;
#------------------- 文字列のドット数を求める
print  qq|<br>n文字列のドット数を求める<br>n|;
# 文字コードを引数で指定する場合
$dot = $aart -> calcu($str, 'euc');
printf qq|「%s」のドット数は、%dです。<br>n|, $str, $dot;
#------------------- 指定したドット数で整形する(undefではなく''空値を指定すること)
print  qq|<br>n指定したドット数で整形する<br>n|;
# $strと''の間に調整ドットを右寄せで整形
printf qq|│%s│<br>n|, $aart -> adjust($str, '', 'R', 350);
# $strと''の間に調整ドットを左寄せで整形
printf qq|│%s│<br>n|, $aart -> adjust($str, '', 'L', 350);
# ''と$strの間に調整ドットを右寄せで整形
printf qq|│%s│<br>n|, $aart -> adjust('', $str, 'R', 350);
# ''と$strの間に調整ドットを左寄せで整形
printf qq|│%s│<br>n|, $aart -> adjust('', $str, 'L', 350);
# $strと$strの間に調整ドットを右寄せで整形
printf qq|│%s│<br>n|, $aart -> adjust($str, $str, 'R', 350);
# $strと$strの間に調整ドットを左寄せで整形
printf qq|│%s│<br>n|, $aart -> adjust($str, $str, 'L', 350);
#------------------- 配列内の文字列が揃う最小のドット数を求める
print  qq|<br>n配列内の文字列が揃う最小のドット数を求める<br>n|;
$dot = $aart -> shorter(@str);
printf qq|│%s│<br>n|, $aart -> adjust($_, '', 'R', $dot) foreach @str;
printf qq|│%s│<br>n|, $aart -> adjust($_, '', 'L', $dot) foreach @str;
printf qq|│%s│<br>n|, $aart -> adjust('', $_, 'R', $dot) foreach @str;
printf qq|│%s│<br>n|, $aart -> adjust('', $_, 'L', $dot) foreach @str;
print qq|</body>n|;

結果は次のとおりです。

HTML::AAのサンプルです。

文字列のドット数を求める
「整形したい文字列です。」のドット数は、162です。

指定したドット数で整形する

│整形したい文字列です。                   .│
│整形したい文字列です。.                   │
│                   .整形したい文字列です。│
│.                   整形したい文字列です。│
│整形したい文字列です。 .....整形したい文字列です。│
│整形したい文字列です。..... 整形したい文字列です。│

配列内の文字列が揃う最小のドット数を求める

│整形したい文字列です。             .│
│このような感じで整形することが出来ます。│
│整形したい文字列です。.             │
│このような感じで整形することが出来ます。│
│             .整形したい文字列です。│
│このような感じで整形することが出来ます。│
│.             整形したい文字列です。│
│このような感じで整形することが出来ます。│

動作サンプル

サンプル

補足

各バージョンごとに使い方が変わると思います。ご注意ください。
$aart -> code(‘euc’);で文字コードを指定しない場合は、初期値のEUC-JPで処理されます。
宣言は何度でも行えます。その宣言は、それより後の処理で使用される文字コードに反映されます。
個別にコードを指定する使用方法があります。興味のある方はソースを見てください。

インストール方法

プロンプトにて、「cpan install HTML::AA」とすることでインストールできます。
または、CPANよりダウンロードできます

おまけ(Excite翻訳にかける前の原文)

#-------------------------------------------------------------------------------
# モジュール宣言
#-------------------------------------------------------------------------------
sub new {}
#-------------------------------------------------------------------------------
# 文字コードを宣言します
#-------------------------------------------------------------------------------
my $code = 'euc';
#-------------------------------------------------------------------------------
# モジュールが処理する文字コードを宣言します
# 文字コードを指定しない呼び出しで有効です
# EUC-JPで処理したいならeuc
# $aart -> code('euc');
# Shift_JISで処理したいならsjis
# $aart -> code('sjis');
#-------------------------------------------------------------------------------
sub code {}
#-------------------------------------------------------------------------------
# ドット数を計算します
# $aart -> calcu($str);
#-------------------------------------------------------------------------------
sub calcu {}
# 文字コード宣言を無視してEUC-JPで処理したい時
# $aart -> calcu_euc($str);
sub calcu_sjis {}
# 文字コード宣言を無視してShift_JISで処理したい時
# $aart -> calcu_sjis($str);
sub calcu_sjis {}
#-------------------------------------------------------------------------------
# 文字列の変数を1文字の配列に分解します
# $aart -> divide($str);
#-------------------------------------------------------------------------------
sub divide {}
# 文字コード宣言を無視してEUC-JPで処理したい時
# $aart -> divide_euc($str);
sub divide_euc {}
# 文字コード宣言を無視してShift_JISで処理したい時
# $aart -> divide_sjis($str);
sub divide_sjis {}
#-------------------------------------------------------------------------------
# 調整ドットを加えた文字列を返します
# $aart -> adjust($str_l, $str_r, position, $size);
#-------------------------------------------------------------------------------
sub adjust {}
# 配置'R'と文字コード宣言を無視してEUC-JPで処理したい時
# $aart -> adjust_right_euc($str_l, $str_r, $size);
sub adjust_right_euc {}
# 配置'L'と文字コード宣言を無視してEUC-JPで処理したい時
# $aart -> adjust_left_euc($str_l, $str_r, $size);
sub adjust_left_euc {}
# 配置'R'と文字コード宣言を無視してShift_JISで処理したい時
# $aart -> adjust_right_sjis($str_l, $str_r, $size);
sub adjust_right_sjis {}
# 配置'L'と文字コード宣言を無視してShift_JISで処理したい時
# $aart -> adjust_left_sjis($str_l, $str_r, $size);
sub adjust_left_sjis {}
#-------------------------------------------------------------------------------
# 配列の文字列が揃う最小ドット数を返します
# $aart -> shorter(@array);
#-------------------------------------------------------------------------------
sub shorter {}
# 文字コード宣言を無視してEUC-JPで処理したい時
# $aart -> shorter_euc(@array);
sub shorter_euc {}
# 文字コード宣言を無視してShift_JISで処理したい時
# $aart -> shorter_sjis(@array);
sub shorter_sjis {}
#-------------------------------------------------------------------------------
# 配列の文字列が揃う指定された数の倍数に当たる最小ドット数を返します
# ($minimun, $magnification) = $aart -> shorter_multiple($width, @arrayL, @arrayR);
#-------------------------------------------------------------------------------
sub shorter_multiple {}
# 文字コード宣言を無視してEUC-JPで処理したい時
# ($minimun, $magnification) = $aart -> shorter_multiple_euc($width, @arrayL, @arrayR);
sub shorter_multiple_euc {}
# 文字コード宣言を無視してShift_JISで処理したい時
# ($minimun, $magnification) = $aart -> shorter_multiple_sjis($width, @arrayL, @arrayR);
sub shorter_multiple_sjis {}

更新履歴

2010-02-17
バグの指摘を掲載
2008-04-03
サイト移動に伴うHTMLの修正(旧URI:[廃止])
2006-10-10
WWW::AAというカテゴリがおかしいと判明したので、HTML::AAに変更 バージョンを0.10
2006-10-04
動作速度が向上するように変更 バージョン0.06
2006-10-09
エスケープシーケンスを1文字としていたのを除去(文字列から削除)に変更。Shift_JISに対応。バージョン0.05
2006-10-04
翻訳の見直しと共に、原文を掲載。ローカルのファイルでは文字列を1文字の配列にする機能を追加。
2006-09-29
WWW::AAサンプルを追加
2006-09-28
コメントをばっさり削除、エラーが出ないように補正、見た目の修正と、コメントの強化などで0.02にバージョンアップ
2006-09-27
プロトタイプとしてWWW:AA0.01をCPANに登録

GD::Arrow 0.01 妙日本語訳

この妙日本語訳はエキサイト翻訳:英語翻訳を利用しつつ、のーみそコネコネして作成しました。
GD::Arrowモジュールのバージョンは0.01です。

目次

名前

GD::Arrow – GDを利用して矢印を描画する

概略

use GD;
use GD::Arrow;
my $width = 8;
my ($x1, $y1) = (100, 10);
my ($x2, $y2) = (100, 190);
my ($x3, $y3) = (10, 30);
my ($x4, $y4) = (190, 75);
my $arrow = GD::Arrow::Full->new( 
                -X1    => $x1, 
                -Y1    => $y1, 
                -X2    => $x2, 
                -Y2    => $y2, 
                -WIDTH => $width,
            );
my $image = GD::Image->new(200, 200);
my $white = $image->colorAllocate(255, 255, 255);
my $black = $image->colorAllocate(0, 0, 0);
my $blue = $image->colorAllocate(0, 0, 255);
my $yellow = $image->colorAllocate(255, 255, 0);
$image->transparent($white);
$image->filledPolygon($arrow,$blue);
$image->polygon($arrow,$black);
my $half_arrow_1 = GD::Arrow::LeftHalf->new( 
                       -X1    => $x3, 
                       -Y1    => $y3, 
                       -X2    => $x4, 
                       -Y2    => $y4, 
                       -WIDTH => $width,
                   );
my $half_arrow_2 = GD::Arrow::LeftHalf->new( 
                       -X1    => $x4, 
                       -Y1    => $y4, 
                       -X2    => $x3, 
                       -Y2    => $y3, 
                       -WIDTH => $width 
                   );
$image->filledPolygon($half_arrow_1,$blue);
$image->polygon($half_arrow_1,$black);
$image->filledPolygon($half_arrow_2,$yellow);
$image->polygon($half_arrow_2,$black);
open IMAGE, "> image.png" or die $!;
binmode(IMAGE, ":raw");
print IMAGE $image->png;
close IMAGE;
exit(0);

説明

これは2点の間に矢を描くのに使用される、GD::polygonのサブクラスです。
GD::Arrow::Full 2点の間に完全な矢を描きます。
                                  |\
           +----------------------+ \
  (X2, Y2) *                         * (X1, Y1)
           +----------------------+ /
                                  |/
GD::Arrow::RightHalf 2点の間に半分の矢を描きます。
  (X2, Y2) *-------------------------* (X1, Y1)
           +----------------------+ /
                                  |/
GD::Arrow::LeftHalf 2点の間に半分の矢を描きます。
                                  |\
           +----------------------+ \
  (X2, Y2) *-------------------------* (X1, Y1)

参照

GD::Polygon

クレジット

The equations used to determine the critical verticies to represent a GD::Arrow
2点からGD::Arrowのために使用される方程式は、オノヒデキのmakefeedmapソフトウェアに基づいています。
Makefeedmapは、http://www.ono.org/software/makefeedmap/で参照することができます。

作者

Todd Caine, <todd@pobox.com>

Copyright 2004 by Todd Caine
このライブラリはフリーソフトウェアです。
Perlと同じ条件で再配布、または変更することが出来ます。

更新履歴

2008-04-03
サイト移動に伴うHTMLの修正(旧URI:[廃止])
2006-06-13
公開