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

HTML/AA 0.01

HTML/AAPHPのモジュールです。
スクリプトと同じ階層か、PHPのモジュール用のパスに設置してください。
AAはアスキーアート(Ascii Art)と同じ要領で、アスキーアジャスト(Ascii Adjust)を行います。
このモジュールは、ブラウザに表示する文字列を整形する機能を有します。
このモジュールは、PerlのHTML::AAモジュールの移植版です。
UTF-8への対応も予定しておりますので、しばらくお待ちください。
ご意見、ご感想は、モジュール内に記載されているメールアドレスまでお寄せください。
PEARへの登録方法がよく分かりません。誰か教えて・・・

注意

エンコードはEUC-JP、Shift_JISに対応しています。
解説は、このページが一番詳しく、判りやすいと思います。
文字コードが異なる場合には、正常な結果を得ることができません。
MS Pゴシック12ポイントで表示した場合に限り、正常に表示できると予想されます。
文字列の先頭に半角スペースが出力された場合、それが行頭になるとずれる現象が発生します。
詳しくは、アスキーアートを紹介しているサイト等を参考にしてください。
文字列内に半角スペースの連続が混入していないと仮定します。

構文

HTML/AAモジュールを使う準備

require_once( 'HTML/AA.php' );
$aart = new AA( );
printf( '%s Version %s', $aart -> module, $aart -> version );
PHP HTML/AA module Version 0.01

文字列の長さを求める

echo $aart -> calcu_euc( '文字列の長さを求める' );
152

文字列を文字1つの配列に分解する

echo join( '|', $aart -> divide_euc( '文字列を文字1つの配列に分解する' ) );
文|字|列|を|文|字|1|つ|の|配|列|に|分|解|す|る

調整ドットを挿入して指定したサイズに整形

// 調整ドットは左側
echo $aart -> adjust_left_euc( '左側の文字', '右側の文字', 256 );
// 調整ドットは右側
echo $aart -> adjust_right_euc( '左側の文字', '右側の文字', 256 );
左側の文字.         右側の文字
左側の文字         .右側の文字

配列を1行と見立てて、整形できる最小のサイズを求める

$ary = array( '配列の中から', '整形可能な最小のサイズを', '返します' );
echo $aart -> shorter_euc( $ary );
226

配列を1行と見立てて、指定された倍数で、整形できる最小のサイズと、何倍かを求める

$ary = array( '配列を1行と見立てて', '指定された倍数で', '整形できる最小のサイズと', '何倍かを求める' );
echo join( ':', $aart -> shorter_multiple_euc( 16, $ary, $ary ) );
400:25

サンプルスクリプト

サンプルスクリプトのEUC-JPとShift_JISはダウンロード用パッケージに同梱されています。

<html>
<head>
<style type="text/css">
<!--
  table,tr,th,td { border:1px gray solid; border-collapse:collapse; text-align:center; }
  input,textarea { margin:4px; }
  input { text-align:center; }
//-->
</style>
</head>
<body>
<?php
require_once( 'HTML/AA.php' );
$aart = new AA( );
printf( '<h1>%s Version %s</h1>', $aart -> module, $aart -> version );
?>
<h3>EUC-JPサンプル</h3>
<ul>
  <li><a href="http://penlabo.net/PHP/HTML-AA.html">HTML/AA(ぺんラボ)</a></li>
  <li><a href="HTML-AA_euc.php">EUC-JP</a></li>
  <li><a href="HTML-AA_sjis.php">Shift_JIS</a></li>
</ul>
<form action="" method="post">
<table>
<tr>
  <td>左側</td>
  <td><input type="submit" value="整形"></td>
  <td>右側</td>
</tr>
<tr>
  <td>
    <textarea name="multilineL" cols="50" rows="10" style="font-size:85%">FightAIDS@Home
Human Proteome
Discovering Dengue Drugs - Together
Rosetta@home
SIMAP
TANPAKU
proteins@home
SETI@Home
Folding@Home
CHRONOS</textarea>
  </td>
  <td>
    <input type="text" name="separate" value="│" size="2">
  </td>
  <td>
    <textarea name="multilineR" cols="50" rows="10" style="font-size:85%">HIVの新薬開発
たんぱく質構造の予測
デング熱治療薬開発プロジェクト
たんぱく質構造の予測
たんぱく質の類似性データベースの構築
たんぱく質構造の予測
たんぱく質構造の予測
地球外の知的生命を検出
たんぱく質構造の予測・アルツハイマー解析
ヒトゲノム染色体間法則性解明</textarea>
  </td>
</tr>
</table>
</form>
<div style="font-family:MS Pゴシック;font-size:12pt">
<?php
if( isset( $_POST['multilineL'] ) && isset( $_POST['multilineR'] ) ){
  aa( $aart );
}
function aa( &$aart ){
  // mb_splitにもスイッチつけれ
  mb_regex_encoding( 'EUC-JP' );
  // 改行コード除去
  $aryL = mb_split( '\x0d\x0a|\x0d|\x0a', $_POST['multilineL'] );
  $aryR = mb_split( '\x0d\x0a|\x0d|\x0a', $_POST['multilineR'] );
  // 配列の小さいほうを基準に
  $max = count( $aryL ) < count( $aryR ) ? count( $aryL ) : count( $aryR );
  $aryL = array_splice( $aryL, 0, $max );
  $aryR = array_splice( $aryR, 0, $max );
  // 最短整列ドット数
  $minL = $aart -> shorter_euc( $aryL );
  $minR = $aart -> shorter_euc( $aryR );
  // 整形
  for( $i = 0; $i < $max; $i ++ ){
    echo $_POST['separate'];
    echo $aart -> adjust_right_euc( '', $aryL[$i], $minL );
    echo $_POST['separate'];
    echo $aart -> adjust_left_euc( $aryR[$i], '', $minR );
    echo $_POST['separate'];
    echo "<br>\r\n";
  }
}
?>
</div>
</body>
</html>
│            .FightAIDS@Home│HIVの新薬開発.                  │
│             .Human Proteome│たんぱく質構造の予測              │
│Discovering Dengue Drugs - Together│デング熱治療薬開発プロジェクト        │
│              .Rosetta@home│たんぱく質構造の予測              │
│                    .SIMAP│たんぱく質の類似性データベースの構築.   │
│                  . TANPAKU│たんぱく質構造の予測              │
│               .proteins@home│たんぱく質構造の予測              │
│                SETI@Home│地球外の知的生命を検出             │
│               .Folding@Home│たんぱく質構造の予測・アルツハイマー解析│
│                 .CHRONOS│ヒトゲノム染色体間法則性解明.        │

動作サンプル

EUC-JPサンプル
Shift_JISサンプル

補足

各バージョンごとに使い方が変わると思います。ご注意ください。
使い勝手がいいとはいえません。ぼちぼち更新していくかもしれませんが、関数名が変更になる可能性があります。
下のように、バージョンチェックをしたほうがいいかもしれません。

if( $aart -> version != 0.01 ){ echo 'The version of the HTML/AA module is different.'; }

ダウンロード

HTML_AA-0.01.zip

履歴

2008-04-07
サイト移動に伴うHTMLの修正(旧URI:[廃止])
2007-09-16
Perlから移植 バージョン0.01

RSS(RubyでRSSをパースする)

説明
RSSファイルを参照し、オリジナルのリーダーを作成する。

RSSの解説は、下のサイトを参考にしました。
RSSによるサイトの情報の要約と公開
RSSモジュールの解説は、下のサイトを参考にしました。
RubyRSS
RSS Parser
確認環境
OS:Windows2000、WindowsVista
Ruby:ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
必要なパッケージ:RSSモジュール(インストールが必要です)
注意
RSSモジュールは、標準でインストールされていません。
Windowsでパッケージを追加するには、上にあるリンクからRSSモジュールのパッケージファイルをダウンロードしてください。
インストール方法は、パッケージを解凍して、その中にある「setup.rb」を実行、つまり「ruby setup.rb」でインストールできます。
リファレンスどおりにコーディングしても、RSSのバージョンによっては正常にパースできないことがあるようです。
動作確認を行ったモジュールのバージョンは0.1.7です。ファイル名でバージョンがわかるようにしてください…。
サンプル
http://pear.php.net/のRSS
ソース
#!/ruby/bin/ruby

require 'rss'

# RSSファイルのURL
url = "http://raa.ruby-lang.org/index.rdf"
content = ""

open( url ) do |s|
	content = s.read
end

# RSSのパース
begin
	rss = RSS::Parser.parse( content )
rescue RSS::InvalidRSSError
	rss = RSS::Parser.parse( content, false )
end

# HTMLの出力開始
print "Content-type: text/html\n\n"

# channnelタグ出力
channel = rss.channel
printf("<html>\n<head>\n\t<title>RSS - %s</title>\n</head>\n<body>\n",
	channel.title
)

printf( "<h3><a href=\"%s\">%s</a></h3>\n<p>%s</p>\n",
	channel.link,
	channel.title,
	channel.description
)

# imageタグ出力
if rss.image != nil then
	image = rss.image
	printf( "<p><a href=\"%s\"><img src=\"%s\" alt=\"%s\" align=\"right\"></a></p>\n",
		image.link,
		image.url,
		image.title
	)
end

# itemタグ出力
print "<dl>\n"
rss.items.each do |i|
	printf( "\t<dt><a href=\"%s\">%s</a></dt>\n\t<dd>%s</dd>\n",
		i.link,
		i.title,
		i.description
	)
end
print "</dl>\n"

# HTMLの出力終了
print "</body>\n</html>\n"

exit;

更新履歴

2007-08-19
nilチェックをさせたら動いた。モジュールなら、自動的にやってくれればいいものを。
2007-08-02
公開。このモジュールではパース出来ないRSSも多く、あまり使えるものにはなっていない。

XML/RSS(PHPでRSSをパースする)

RSSファイルを参照し、オリジナルのリーダーを作成します。
RSSの解説は、RSSによるサイトの情報の要約と公開を参考にしました。
XML_RSSパッケージの解説は、XML_RSSを参考にしました。
使用したXML_RSSパッケージのバージョンは1.14(0.9.10)でした。
XML_RSSパッケージは、PHPのバージョン5.2.1ではインストールされていません。

インストール方法

XML_RSSをインストールすると、XML_Treeも同時にインストールされます。

pear install -a XML_RSS

サンプル

http://pear.php.net/のRSS

構文

<?php
require_once( "XML/RSS.php" );
// RSSファイルのURL
$rss = new XML_RSS( "http://pear.php.net/feeds/latest.rss" );
// RSSのパース
$rss -> parse();
// channnelタグ出力
$channel = $rss -> getChannelInfo();
printf( "<html>\n<head>\n\t<title>RSS - %s</title>\n</head>\n",
  $channel['title']
);
printf( "<h1><a href=\"%s\">%s</a></h1>\n<p>%s</p>\n",
  $channel['link'],
  $channel['title'],
  $channel['description']
);
// imageタグ出力
if( isset( $rss -> images ) ){
  foreach( $rss -> getImages() as $image ){
    if( !count($image) ){ continue; }
    printf( "<p><a href=\"%s\"><img src=\"%s\" alt=\"%s\" align=\"right\"></a></p>\n",
      $image['link'],
      $image['url'],
      $image['title']
    );
  }
}
// itemタグ出力
echo "<dl>\n";
foreach( $rss -> getItems() as $item ){
  printf( "\t<dt><a href=\"%s\">%s</a></dt>\n\t\t<dd>%s</dd>\n",
    $item['link'],
    $item['title'],
    isset( $item['description'] ) ? $item['description'] : ""
  );
}
echo "</dl>\n";
// HTMLの出力終了
echo "</body>\n</html>";
?>

更新履歴

2008/04/04
サイト移動に伴うHTMLの修正(旧URI:[廃止])
2007/07/31
PHPXML_RSSとあわせるための細かな修正
2007/07/30
公開

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