PostScript::Simple(PerlでPostScriptのファイルを作成する)

  ただの画像を作成するには、ImageMagickというツールがありますが、
印刷に関係する図形や文字を作成するには、適していません。
ページ記述言語であるPostScriptを利用することが出来れば、印刷にも利用できます。
なお、PostScriptで作成したものをImageMagickに変換するには、
GhostScriptというツールがありますが、日本語等の2バイト文字への扱いが不完全です。
使用したPostScript::Simpleモジュールのバージョンは0.07でした。
CPANには登録されていませんが、Windowsであれば、ppmからインストールできます。

はじめに

PostScriptは、ページ記述言語です。
これを利用することで、様々な図形などを記述することが出来ます。
座標や単位についての解説は、また後述しますが、
基本的に左下を0,0とし、右上に向かうほど大きくなります。
なお、PostScripの画像は、ImageMagickを利用して以下のコマンドでpng画像に変換してあります。
また、画像はトリミングしてありますので、ご注意ください。
一部オプションは文章の説明のみとさせていただいております。

convert sample.ps -trim sample.png

平行移動や回転、拡大縮小の使い勝手はあまりよくないといういか、
まだ未実装のようです。(バージョン0.07現在)
ただ、EPSファイルの埋め込みが出来ますので、その機能が必要で使用しました。
なお、モジュールで使用している変数に直接追加することで、補うことが出来ます。
末尾の改行を忘れると、PostScriptとして記述エラーになることがありますので、
必ず記述しておくようにしましょう。

$ps -> {'pspages'} .= "1.2 1 scale\n";

空のファイルを作成する

何も表示されない空のファイルを作成します。

use PostScript::Simple;
$ps = new PostScript::Simple(papersize => "A4",
                            colour => 1,
                            eps => 0,
                            units => "in");
$ps -> newpage; # ページ宣言
$ps -> output( 'sample.ps' ); # ファイル保存

直線を描く

線を引くには、始点と終点を指定します。
太さと色は、指定しなくても可能です。
引数は左から「始点のx座標」「始点のy座標」「終点のx座標」「終点のy座標」です。
また、色を直接指定することもできますが、継承されるので注意が必要です。
引数は先のものに、「r色の10進表記」「g色の10進表記」「b色の10進表記」を加えます。

use PostScript::Simple;
$ps = new PostScript::Simple(papersize => "A4",
                            colour => 1,
                            eps => 0,
                            units => "in");
$ps -> newpage; # ページ宣言
$ps -> setlinewidth( 0.01 );   # 線の太さを指定
$ps -> setcolour( 255, 0, 0 ); # 線の色を指定
$ps -> line( 1, 1,  3, 3 );             # 直線を描く
$ps -> line( 2, 1,  1, 2,  0, 0, 255 ); # 色を指定して直線を描く
$ps -> output( 'sample.ps' ); # ファイル保存

このようになります。

直線画像
png画像、146×146ピクセル

折れ線を描く

折れ線を描くには、2通りの方法が用意されています。

一本ずつ個別に指定する

直線を引いた後に次の座標を指定します。
lineメソッドを利用しないままlinextendメソッドを呼び出すと、警告が表示されます。
太さと色は、指定しなくても可能です。
引数は継続して線を描く、「次のx座標」「次のy座標」です。

use PostScript::Simple;
$ps = new PostScript::Simple(papersize => "A4",
                            colour => 1,
                            eps => 0,
                            units => "in");
$ps -> newpage; # ページ宣言
$ps -> setlinewidth( 0.01 );   # 線の太さを指定
$ps -> setcolour( 255, 0, 0 ); # 線の色を指定
$ps -> line( 1, 1,  3, 3 ); # 直線を描く
# 続きの線を描く
$ps -> linextend( 2, 3 );
$ps -> linextend( 3, 2 );
$ps -> output( 'sample.ps' ); # ファイル保存

このようになります。

折れ線画像
png画像、146×146ピクセル

一度に指定する

折れ線を描くには、直線を引いた後に次の座標を指定します。
lineメソッドを利用しないままlinextendメソッドを呼び出すと、警告が表示されます。
太さと色は、指定しなくても可能です。
引数は、「始点のx座標」「始点のy座標」「終点のx座標」「終点のy座標」です。
平行移動させるには、「offset => [ (x座標), (y座標) ]」オプション、
塗り潰すには「filled => 1」オプション、
回転させるには、「rotate => (角度)」オプションもあります。

use PostScript::Simple;
$ps = new PostScript::Simple(papersize => "A4",
                            colour => 1,
                            eps => 0,
                            units => "in");
$ps -> newpage; # ページ宣言
$ps -> setlinewidth( 0.01 );   # 線の太さを指定
$ps -> setcolour( 255, 0, 0 ); # 線の色を指定
$ps -> polygon( 1, 1,  2, 3,  3, 2, 2, 1, 1, 3 ); # 折れ線を描く
$ps -> output( 'sample.ps' ); # ファイル保存

このようになります。

折れ線画像
png画像、146×146ピクセル

四角形を描く

線を描くのと同じように、四角形を構成する始点と終点を指定します。
太さと色は、指定しなくても可能です。
引数は、「始点のx座標」「始点のy座標」「終点のx座標」「終点のy座標」です。
塗り潰すには「filled => 1」オプションがあります。

use PostScript::Simple;
$ps = new PostScript::Simple(papersize => "A4",
                            colour => 1,
                            eps => 0,
                            units => "in");
$ps -> newpage; # ページ宣言
$ps -> setlinewidth( 0.01 );   # 線の太さを指定
$ps -> setcolour( 255, 0, 0 ); # 線の色を指定
$ps -> box( 1, 1,  3, 3 );     # 四角形を描く
$ps -> output( 'sample.ps' ); # ファイル保存

このようになります。

四角形画像
png画像、146×146ピクセル

円を描く

円を描くには、中心と半径を指定します。
太さと色は、指定しなくても可能です。
引数は、「中心のx座標」「中心のy座標」「半径の長さ」です。

use PostScript::Simple;
$ps = new PostScript::Simple(papersize => "A4",
                            colour => 1,
                            eps => 0,
                            units => "in");
$ps -> newpage; # ページ宣言
$ps -> setlinewidth( 0.01 );   # 線の太さを指定
$ps -> setcolour( 255, 0, 0 ); # 線の色を指定
$ps -> circle( 2, 2,  1 );     # 円を描く
$ps -> output( 'sample.ps' ); # ファイル保存

このようになります。

円画像
png画像、146×146ピクセル

孤を描く

孤を描くには、中心と半径、そして開始角と終了角を指定します。
太さと色は、指定しなくても可能です。
引数は、「中心のx座標」「中心のy座標」「半径の長さ」「開始角度」「終了角度」です。
角度は右が始点、つまり座標では「(中心のx座標) + (半径の長さ), 中心のy座標」になります。
塗り潰すには「filled => 1」というオプションがありますが、
あらかじめ孤を描いておかないと利用できないなど、使い勝手がよろしくありません。

use PostScript::Simple;
$ps = new PostScript::Simple(papersize => "A4",
                            colour => 1,
                            eps => 0,
                            units => "in");
$ps -> newpage; # ページ宣言
$ps -> setlinewidth( 0.01 );     # 線の太さを指定
$ps -> setcolour( 255, 0, 0 );   # 線の色を指定
$ps -> arc( 2, 2, 1,  0,  270 ); # 孤を描く
$ps -> output( 'sample.ps' ); # ファイル保存

このようになります。

孤画像
png画像、146×146ピクセル

文字を描く

文字を書くには、フォントの指定が必要になります。
日本語を扱う場合には、特にフォントに関する知識が必要となります。
画像に変換する場合には、GhostScriptの設定が必要です。
インストールしたままの状態では、フォントが見つからないという警告が表示され、
画像に変換できませんので、注意してください。
設定の方法については、別に機会にいたします。
フォントの太さを指定するメソッドが別にありますので、線の太さを指定するメソッドは必要ありません。
配置を指定する「align => (left/center/right)」オプションと、
回転を指定する「rotate => (角度)」オプションがあります。

use PostScript::Simple;
$ps = new PostScript::Simple(papersize => "A4",
                            colour => 1,
                            eps => 0,
                            units => "in");
$ps -> newpage; # ページ宣言
$ps -> setcolour( 255, 0, 0 );   # 線の色を指定
$ps -> setfont( 'MS-Mincho-90ms-RKSJ-H', 36 ); # フォントをエンコード方法なども含めて指定
$ps -> text( 1, 1, 'ぺんラボ' );               # 文字はShift_JISで指定
$ps -> output( 'sample.ps' ); # ファイル保存

このようになります。

文字画像
png画像、140×32ピクセル

解説していないメソッドについて

以下のメソッドについては、
モジュールの使い方というよりもPostScriptの解説になりますので、
このページではただいま解説は行っておりません。
詳しくは、PostScriptの解説を行っているサイトや、PostScript::Simpleモジュールをご覧下さい。

  • newpage
  • putput
  • get
  • geteps
  • circletext
  • curve
  • curveextend
  • newpath
  • moveto
  • importepsfile
  • importeps

更新履歴

2008-06-22
一部のメソッドについて解説を追加
2008-06-15
公開

Date::Simple(Perlで日付の使いに困ったら)

日付は様々なフォーマットで表示され、その扱いの困ることも多いでしょう。
月を跨いだ期間を求める場合などが、その例です。
使用したDate::Simpleモジュールのバージョンは3.02でした。
便利なモジュールですが、Perlのバージョンが5.8の場合には、追加でインストールしなければいけません。
現時点ではインストール方法のみのご紹介となっております。
なお、Date::Simpleモジュールでは手に負えなかったり、時間を含む場合には、HTTP::Dateモジュールをお勧めします。

インストール方法

Windowsの場合

OSがWindowsの場合には、新しいバージョンのバイナリが用意されているので、ppmを利用してインストールできます。

ppm install Date-Simple

Linuxの場合

OSがLinuxの場合には、パッケージをダウンロードして手動でインストールを行うべきです。
なぜなら、CPANシェルからインストールできるものは、バージョンが古いままだからです。
また、CPANシェルを利用して通常の方法でインストールを行うと、以下のエラーメッセージが表示されるかもしれません。
なお、この状況は改善されるかもしれませんので、問題が確認された場合に活用してください。

Failed 1/1 test scripts, 0.00% okay. 1/227 subtests failed, 99.56% okay.

エラーメッセージが表示される場合には、以下の手順でインストールを行います。
「export LANG=C」という1行が必要です。
なお、この手順が必要だったOSがCentOS5.0でした。

make distclean
perl Makefile.PL
export LANG=C
make test
make install

Perlで10進数を変換する

10進の整数を変換する方法です。

10進数2進数

packとunpackを利用する。

print unpack( 'B8', pack( 'C', 31 ) ); # 正値
00011111
print unpack( 'B8', pack( 'C', -31 ) ); # 負値
11100001

10進数8進数

printfを利用する。

printf( '%o', 31 );
37

10進数16進数

packとunpackを利用する。

print unpack( 'h3', pack( 'C', 31 ) );
1f

sprintfを利用する。

printf( '%x', 31 );
1f

10進数→文字列

packを利用する。

print pack( 'C', 97 );
a

packはまとめて利用することも出来ます。

print pack( 'C*', 97, 98, 99 );
print pack( 'C*', 227, 129, 130 );
abc
あ # UTF-8の場合

更新履歴

2014-10-21
固定ページから投稿に変更
2008-06-13
公開

Net::FTP(PerlでFTPによるファイル送信を行う)

PerlFTPを利用したい場合、Net::FTPモジュールを利用することになるでしょう。
Net::FTPモジュールについて、説明や翻訳ページは検索すれば沢山見つかります。
しかし、送信するときに重要な「転送モード」について、説明してあるところは多くありません。
なぜかというと、Net::FTPモジュールのドキュメントには転送モードについては記述されていないからです。
ということで、このページでは、転送モードについてご紹介したいと思います。
使用したNet::FTPモジュールのバージョンは2.77でした。
Perlのバージョンが5.8であれば、インストールされています。

使い方

何はともあれ、次のコードを見てください。
Net::FTPモジュールを使おうという方にとっては、コードを見たほうが簡潔だと思います。

use strict;
use Net::FTP;
# FTP設定
my %ftp = (
	addr => 'exsample.com', # FTPアドレス
	user => 'user_name',    # ユーザー名
	pass => 'pass_word',    # パスワード
	dir  => '/public_html', # 送信先ディレクトリ
);
my $ftp = Net::FTP -> new( $ftp{'addr'}, Debug => 0 ) or die;
$ftp -> login( $ftp{'user'}, $ftp{'pass'} ) or die;
# カレントディレクトリの変更
$ftp -> cwd( $ftp{'dir'} );
# アスキーモード
$ftp -> type( 'A' );
# ファイルの送信
$ftp -> put( 'string.txt' );
# バイナリモード
$ftp -> type( 'I' );
# ファイルの送信
$ftp -> put( 'image.jpg' );
# 接続切断
$ftp -> quit();
exit;

転送モードアスキーを指定する場合は、typeに「A」を指定します。

$ftp -> type( 'A' );

転送モードバイナリを指定する場合は、typeに「I」を指定します。

$ftp -> type( 'I' );

備考

ドキュメントに記載されていないという意味では、今後変更になるかもしれません。
また、ソースコードを読めば判りますが、バイナリを指定する「I」以外に「E」や「L」も用意されているようです。

おわりに

翻訳サイトだけを読んで満足してはいけないということです。
実際に使っているからこそ、気がつくこともあるのです。
疑問に思った事について検索はもちろんのこと、
実際に動作しているモジュールのソースコードに目を通してみましょう。

更新履歴

2008-06-03
公開

Digest::MD5(Perlでmd5を利用する)

PHPには、md5()という標準関数が用意され、簡単にハッシュを作成することが出来ます。
例えば、「12345」という文字列のハッシュは「827ccb0eea8a706c4c34a16891f84e7b」となります。
しかし、Perlにはハッシュを作成できる標準関数はありません。
使用したDigest::MD5モジュールのバージョンは2.36でした。
Perlのバージョンが5.8であれば、インストールされています。

使い方

use Digest::MD5 qw/md5_hex/;
print md5_hex( 12345 );
my $md5 = md5_hex( 12345 );
print $md5;

PHPの場合

PHPには標準関数が用意されています。

$md5 = md5( 12345 );
echo $md5;

関連サイト

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
公開

XML::Simple(PerlでXMLをパースする)

Ajaxへの熱が冷めはじめた昨今、しかしXMLファイルを扱う機会はあまり減りません。
使用したXML::Simpleモジュールのバージョンは2.18でした。
Perlのバージョンが5.8であれば、インストールされています。

使い方

my $xml = <<'XML';
<?xml version="1.0" encoding="UTF-8"?>
<urlset>
  <url>http://127.0.0.1/</url>
  <title>localhost</title>
  <copyright>Administrator</copyright>
</urlset>
XML
use XML::Simple;
my $xs = new XML::Simple();
my $parser = $xs -> XMLin( $xml );
my %parse = (
  'uri'       => $parser -> {'uri'},
  'title'     => $parser -> {'title'},
  'copyright' => $parser -> {'copyright'},
);
use utf8;
foreach my $key ( keys %parse ){
  utf8::encode( $parse{$key} );
  printf( "%s : %s\n", $key, $parse{$key} );
}

不具合

エンコードが正しく指定されていても、UTF-8以外であれば受け付けてくれません。

おわりに

結果の文字列にBOMを付けるという余計な事をするため、
utf8::encodeでBOMを除去する処理が必要になってしまいます。
スイッチをつけるなどして、選べるようにしてほしい。

更新履歴

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

LWP::Simple(PerlでWeb上のリソースを取得する)

お手軽に、Web上のリソースを取得しましょう。
使用したLWP::Simpleモジュールのバージョンは1.41でした。
Perlのバージョンが5.8であれば、インストールされています。

使い方

use LWP::Simple;
my $html = get( 'http://127.0.0.1/' );
print $html;

不具合

HTTPレスポンスコードが200以外の場合、プロセスが死ぬので注意。

PHPの場合

とってもお手軽な標準関数が用意されています。

$html = file_get_contents( 'http://127.0.0.1/' );
echo $html;

おわりに

レスポンスコードを返してくれても良いような気がします。

更新履歴

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

HTML::HeadParser(PerlでHTMLヘッダをパースする)

Webサイトのmetaタグを解析する必要が増えてきました。
いままでは、パターンマッチで一つずつ取り出していました。
モジュールが用意されているので、使ってみましょう。
使用したHTML::HeadParserモジュールのバージョンは2.22でした。
Perlのバージョンが5.8であれば、インストールされています。

使い方

use LWP::Simple;
my $html = get( 'http://127.0.0.1/' );
use HTML::HeadParser;
my $p = new HTML::HeadParser;
$p -> parse( $html );
my %parse = (
  'title'       => $p -> header( 'title'              ),
  'charset'     => $p -> header( 'content-type'       ),
  'copyright'   => $p -> header( 'x-meta-copyright'   ),
  'keywords'    => $p -> header( 'x-meta-keywords'    ),
  'description' => $p -> header( 'x-meta-description' ),
);
foreach my $key ( keys %parse ){
  printf( "%s : %s\n", $key, $parse{$key} );
}

不具合

XHTMLのソースを渡すとエラーでプロセスが落ちてしまうので、
HEADタグの中身のみを渡した方がいいでしょう。

おわりに

x-metaという使い方には、いまだに慣れません。
XHTMLに対応して、URIを直接指定したいですね。

更新履歴

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

2008-01-07
公開

XML::RSS(PerlでRSSをパースする)

  現在はバージョン1.33が公開されています。

RSSファイルを参照し、オリジナルのリーダーを作成してみます。
RSSの解説は、RSSによるサイトの情報の要約と公開を参考にしました。
このモジュールは、ローカルに保存したファイルのタイムスタンプを比較し、無駄なトラフィックを回避しているそうです。
使用したXML::RSSモジュールのバージョンは1.12でした。
Perlのバージョンが5.8では、インストールされていません。
動作確認を行ったXML::RSSのバージョンは1.12です。最新版は確認しておりません。

インストール方法

CPANからインストール

以下のように、パッケージを直接指定しなければなりません。
CPANでインストールすると、バージョンは1.32です。

cpan install S/SH/SHLOMIF/XML-RSS-1.32.tar.gz

ppmでインストール

モジュール名の指定でインストールできます。
ppmでインストールすると、バージョンは1.12です。

ppm install XML-RSS

サンプル

http://search.cpan.orgのRSS

構文

#!/perl/bin/perl
use strict;
use XML::RSS;
use LWP::Simple;
# RSSファイルのURL
my $url = 'http://search.cpan.org/uploads.rdf';
# 保存ファイルパス
my $file = './rss';
# RSS更新確認(ここで$fileが最新になる)
mirror( $url, $file );
# RSSパース
my $rss = new XML::RSS;
$rss -> parsefile( $file );
# HTMLの出力開始
print qq|Content-type: text/html\n\n|;
# channnelタグ出力
my $channel = $rss -> {'channel'};
printf( qq|<html>\n<head>\n\t<title>RSS - %s</title>\n</head>\n<body>\n|,
  $channel -> {'title'},
);
printf( qq|<h1><a href="%s">%s</a></h1>\n<p>%s</p>\n|,
  $channel -> {'link'},
  $channel -> {'title'},
  $channel -> {'description'},
);
# imageタグ出力
my $image = $rss -> {'image'};
printf( qq|<p><a href="%s"><img src="%s" alt="%s" align="right"></a></p>\n|,
  $image -> {'link'},
  $image -> {'url'}, 
  $image -> {'title'},
);
# itemタグ出力
print qq|<dl>\n|;
foreach my $item ( @{$rss -> {'items'}} ){
  printf( qq|\t<dt><a href="%s">%s</a></dt>\n\t<dd>%s</dd>\n|,
    $item->{'link'},
    $item->{'title'},
    $item->{'description'},
  );
}
print qq|</dl>\n|;
# HTMLの出力終了
print qq|</body>\n</html>|;
exit;

更新履歴

2008-08-31
バージョン1.33公開の追記
2008-04-04
サイト移動に伴うHTMLの修正(旧URI:[廃止])
2007-07-31
PHPのXML_RSSとあわせるための細かな修正
2007-07-30
公開