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

VB.NETでMicrosoft Outlookのメールを読む

はじめに
VB.NETの環境は、Microsoft Visual Basic 2005 Express Editionを利用しています。
Microsoft OutlookではないOutlookには、対応していません。
準備
新しいプロジェクトを作成してください。
次に、APIの読み込みを行います。「メニューバーのプロジェクト > 参照の追加」より、COMタブを選択し、「Microsoft Outlook 9.0 Library」コンポーネントを選択します。数値の部分は、インストールしてあるMicrosoft Officeのバージョンで変化することがあります。ちなみに、Microsoft Office2000では9.0です。
受信トレイのメールを読む
まずは、受信トレイのメールを読んでみたいと思います。
受信したメールタイトルを表示するためのリストボックス(ListBox1)を用意します。
受信トレイのメールを読むタイミングは、起動時に行います。つまり、Form1_Loadに記述します。
  Private Sub Form1_Load( _
      ByVal sender As System.Object, _
      ByVal e As System.EventArgs _
  ) Handles MyBase.Load

      Dim myOlApp As Outlook.Application = CreateObject("Outlook.Application")
      Dim myNameSpace = myOlApp.GetNamespace("MAPI")
      Dim myFolder = myNameSpace.GetDefaultFolder(6)

      Dim i As Integer
      For i = 1 To myFolder.Items.Count
          Dim myitem = myFolder.Items(i)
          ListBox1.Items.Add(myitem.Subject)
      Next

      myFolder = Nothing
      myNameSpace = Nothing
      myOlApp = Nothing

  End Sub
myNameSpace.GetDefaultFolder(6)の6が受信トレイのフォルダを指します。
フォルダにある各メールは番号で管理されており、Itemsのインデックス番号で参照できます。
Microsoft Outlookの受信トレイにメールがあるのを確認してから、実行してください。
outlook1
問題なく表示できたでしょうか?
メールの本文を読む前に
次は、メールのタイトルを読むことができたので、リストを選択すると内容が表示されるようにします。
メールの内容を読むためには、そのメールのインデックス番号が必要です。
そこで、メールタイトルをキーに、メール番号を値としたハッシュを用意します。
    Public mail As Hashtable = New Hashtable

    Private Sub Form1_Load( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs _
    ) Handles MyBase.Load

        Dim myOlApp As Outlook.Application = CreateObject("Outlook.Application")
        Dim myNameSpace = myOlApp.GetNamespace("MAPI")
        Dim myFolder = myNameSpace.GetDefaultFolder(6)

        Dim i As Integer
        For i = 1 To myFolder.Items.Count
            Dim myitem = myFolder.Items(i)
            ListBox1.Items.Add(myitem.Subject)
            mail(myitem.Subject) = i
        Next

        myFolder = Nothing
        myNameSpace = Nothing
        myOlApp = Nothing

    End Sub

変更した場所を赤く表示しています。これで、リストの値からメール番号を得られるようになりました。
メールの本文を読む
内容を表示するためのテキストボックス(TextBox1)を用意します。
TextBox1はプロパティの設定で、MultilineとScrollBarsをTrueに変更しておきます。
内容を表示するには、ListBox1のSelectedIndexChangedイベントを利用します。
  Private Sub ListBox1_SelectedIndexChanged( _
      ByVal sender As System.Object, _
      ByVal e As System.EventArgs _
  ) Handles ListBox1.SelectedIndexChanged

      Dim myOlApp As Outlook.Application = CreateObject("Outlook.Application")
      Dim myNameSpace = myOlApp.GetNamespace("MAPI")
      Dim myFolder = myNameSpace.GetDefaultFolder(6)

      Dim myitem = myFolder.Items(mail(ListBox1.Text))
      TextBox1.Text = myitem.Body

  End Sub
メール番号は1から始まります。
outlook2
これで、選択したメールの内容を表示することができました。
メールの内容は、text形式かhtml形式かの判断は行っていません。
html形式では、ソースが表示されますが、一部は「?」という文字に化けます。
おまけ
myitem.Subject 件名
myitem.SenderName 送信者名
myitem.SentOnBehalfOfName 送信者名(SenderNameとどう違う?)
myitem.Body 内容
myitem.ReceivedTime 受信時間
myitem.To 送信先

更新履歴

2007-07-21
公開

ImageMagickで文字を描画する

このページは、Text Handingを基準に作成されていますが、
翻訳ページではありませんので、ご注意ください。
captionでも作成できますが、とりあえず保留します。
また、コード内において改行が含まれていますが、実際には改行を含まずに入力することが必要です。
サンプルで使用したフォントはあくあフォントです。

オプションの説明

文字については、フォントが持っている幅が利用されるため、余白が生まれます。
-trim“オプションを利用すれば、出来るだけ小さな画像にすることは出来ますが、
座標で決め打ちするような画像の合成時に、誤差の原因となる可能性があるため、利用は控えたほうがいいかもしれません。

オプション 内容 細く
-background 背景の色 指定しない場合は白色になり、透明情報を持てる形式で出力する場合には「none」を指定すれば透明になる。
-fill 文字の色 文字の色を指定しなければ、背景で塗られた画像が作成される。
ただし、画像サイズは文字の色を指定したときと同じものになる。
-pointsize 文字の大きさ
(pt)
文字の大きさを指定しなくても、画像サイズが指定されていれば自動で調整されるが、
画像サイズが指定されていなければ、おそらく12ptで作成されているらしい。

文字サイズを基準に描画する

画像サイズは自動的に調整されます。

convert -background white -fill blue 
	-font aquafont.ttf -pointsize 32 label:penlabo.net text1.png
文字サイズ基準画像

png画像、176×34ピクセル

画像サイズを基準に描画する

縦と横のサイズを指定する

文字サイズは自動的に調整されますが、余白が出来ます。
この余白を調整するには”-gravity“オプションを設定します。

convert -background white -fill blue 
	-font aquafont.ttf -size 256x64 label:penlabo.net text2.png

画像サイズ基準画像

png画像、256×64ピクセル

横のサイズを指定する

文字サイズは自動的に調整されますが、余白が出来ます。
横のサイズのみを指定することにより、縦は自動で調整されます。

convert -background white -fill blue 
	-font aquafont.ttf -size 256x label:penlabo.net text3.png

画像サイズ横基準画像

png画像、256×47ピクセル

縦のサイズを指定する

文字サイズは自動的に調整されますが、余白が出来ます。
縦のサイズのみを指定することにより、横は自動で調整されます。

convert -background white -fill blue 
	-font aquafont.ttf -size x64 label:penlabo.net text4.png

画像サイズ縦基準画像

png画像、336×64ピクセル

改行を含む文字描画する

文字列に「\n」を含めれば、改行コードも利用できます。

convert -background white -fill blue 
	-font aquafont.ttf -pointsize 32 label:penlabo\n.net text5.png

画像サイズ改行有り画像

png画像、113×67ピクセル

日本語を描画する

テキストファイルを指定すれば、日本語も画像に出来ます。
ただし、文字コードは「UTF-8」で保存する必要がありますが、BOMの有り無しは関係ないようです。
改行も有効なので、スクリプトから画像を作成する際には便利です。

convert -background white -fill blue 
	-font aquafont.ttf -pointsize 32 label:@text6.txt text6.png

画像サイズ縦基準画像

png画像、126×34ピクセル

画像の中の指定した場所に文字描画する

-annotate“オプションを利用することで、文字を自由に配置できますが、
画像のx座標と座標だけでは、思い通りになりません。
フォントの持つ特性を理解しなければならならず、ちょっとした工夫が必要となります。

とりあえず、何も考えずに座標(0,0)を指定してみましょう。

convert -size 256x64 xc:white -fill blue 
	-font aquafont.ttf -pointsize 32 
	-annotate +0+0 penlabo.net annotate1.png

座標0,0画像

png画像、256×64ピクセル

とても悲惨な画像が作成されました。
上部になにやら見えていますが、これでは何一つ判りません。
次は試しにy座標の値を、画像の高さと同じに変更してみましょう。

convert -size 256x64 xc:white -fill blue 
	-font aquafont.ttf -pointsize 32 
	-annotate +0+64 penlabo.net annotate2.png
座標0,64画像

png画像、256×64ピクセル

今度は、どういう文字が書いてあるのかが判るようになりましたが、今度は下部が切れてしまいました。
2つの画像を見比べると、上下につなぎ合わせれば1つの画像になることが判ります。

座標0,0画像←画像2つ目
座標0,64画像←画像1つ目

-annotate“でy座標を指定するときには、フォントのベースラインを基準にしなければならないのです。
-font“、”-poinsize“を基準に求めたベースラインの座標を指定しなければ、思うように配置が出来ないのです。

いろいろ調べましたが、ベースラインの座標を求める方法が見つかりませんでした。
もし、ご存知の方がいらっしゃいましたら、ご教授をお願いいたします。
次の方法を取れば、画像を作ってはそのサイズを求め・・・といった肯定を省くことが出来ます。
ベースラインの座標を求めるには、文字を基準に画像を作成し、余白を除去する”-trim”オプションを追加します。

convert -font aquafont.ttf -pointsize 32 
	label:penlabo.net -trim info:

背景や文字の色は、指定しなくても問題ありません。
ファイル名を”info:”と指定することで、画像ファイルではなく画像情報が出力されます。

label:penlabo.net LABEL 173x27 176x34+1+5 DirectClass 8-bit

この場合は27ピクセルとわかりました。

convert -size 256x34 xc:white -fill blue 
	-font aquafont.ttf -pointsize 32 
	-annotate +0+27 penlabo.net annotate3.png

これで、座標を指定して思い通りの場所に文字描画することができるようになりました。

更新履歴

2007-06-02
公開

WCG日報スクリプト配布

こちらのコンテンツは非サポートです。
このスクリプトは自由に改変し配布し販売することができます。
他人のスクリプトを読むのが苦手な方には向かないとおもいます。
2018-05-29 記

WCGとは、World Community Gridの略で、
分散コンピューティングBOINCの医療系プロジェクトの名称。
WCGに参加すると、タンパク質の構造予測や解析、新薬の開発に携わることになります。
2007年4月27日に突然UD(United Devices)が終了し、
UDの最強チーム「Team 2ch」のユーザーが移動(後に難民の大移動と呼ばれる)したため、
WCGの弱小チーム「Team 2ch」はその日を境に、強大なチームへと変貌する。
当サイトの管理者である404は、日報支援サイトとしてWCGTeam 2ch:404を運営しており、
このページでは、そのサイトで使用している日報スクリプトの公開を行っております。

WCG-LOGO

日報スクリプト

日報スクリプトは、割と高度な処理が行われています。
まず、WCGの更新を監視し、情報の取得と解析、そして計算が行われます。
これら一連の処理は、レンタルサーバーで実行することは難しいでしょう。
自宅サーバーを公開できるスキルと、Perlのモジュールを追加できる知識が求められます。

ファイル構成

folder wcg-team2ch
├ while_wcg.pl – 繰り返しcheck_wcg.plを起動するためのもの
| └ check_wcg.pl – コア
|   ├ require.pl – いろいろなライブラリ
|   └ calender.pl – カレンダーライブラリ
folder public_html – 公開用ディレクトリ(httpサーバールート)
├ stat.cgi – 日報CGI
| ├ menu.cgi – メニューAjax
| ├ stat.js – JavaScript
| └ menu.js – JavaScript
folder grp – 板名(自動生成)
│ ├ 801.txt
│ ├ ainotae.txt
│ └(以下、更新毎に変化)
folder log – 更新情報
│ ├ 20080523_board.tsv
│ ├ 20080523_member.tsv
│ ├ 20080523_team.tsv
│ ├ 20080524_country.tsv
│ ├ board_ame.txt
│ ├ board_points.tsv
│ ├ board_result.tsv
│ ├ country_point.tsv
│ ├ file.txt
│ ├ team_points.tsv
│ └ (以下、更新毎に増殖)
folder msg – check_wcg.pl活動ログ
│ ├ 20080523_act.log
│ └(以下、更新毎に増殖)
folder temp – テンポラリ
| ├ folder id – ID別
| | ├ 0B5RSMBR9N1.xml
| | ├ 0BCGCWNDR1.xml
| | └ (以下、更新毎に変化)
│ ├ country_member.tsv
│ ├ country_point.tsv
│ ├ country_result.txt
│ ├ country_time.txt
│ ├ member_total.tsv
│ ├ member_total.txt
│ ├ team_id.tsv
│ └(更新毎に変化)
folder xml – テンポラリ
│ ├ %2d777%2d%40slot.xml
│ ├ %2d+silverfox+%2d.xml
| └ (以下、更新毎に変化)
folder zip – 書庫(tmpl書庫ファイル)
├ 20080523_member.zip
├ 20080523_team.zip
├ 20080524_country.zip
└ (以下、更新毎に増殖)

必須モジュール

公開しているスクリプトは、Perl5.8.8での動作を確認しています。
モジュールは記憶違いにより、追加(インストール)が必要だったり、
ビルドやバージョンの違い(Perl5.10もあり)で標準モジュールかもしれません。
モジュールの追加方法は、Google先生または404へ直接聞いてください。

  • Archive::Zip – 追加
  • CGI – 標準
  • Encode – 要upgrade
  • File::Path – 追加
  • HTML::AA – 追加
  • HTTP::Request – 標準
  • HTTP::Request::Common – 標準
  • HTTP::Cookies -標準
  • HTTP::Date – 追加
  • HTML::Entities
  • HTML::Template – 追加
  • Jcode – 要upgrade
  • LWP::UserAgent – 標準
  • XML::Simple – 追加

動作の流れ

ソースを見てください…。m(_ _)m

稼動サイト

WCG-Team2ch 404

ダウンロード

更新履歴

2008-05-24
サイト移動に伴うHTMLの加筆
(旧URI:[廃止])
2008年5月22日バージョン公開
2007-07-25
公開

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

UD日報スクリプト配布

説明
がん・白血病患者を救うことができるかもしれないプロジェクト「UD(UnitedDevices)」のランキングスクリプトです。
UDの詳細は「ud-team2ch banner」または、2ちゃんねる案内板ラウンジのUDスレをごらん下さい。
注意
Windowsの自宅サーバーで運営する設計になっています。
Perlが実行できる環境が必要です。
必要なモジュールは、cgiとplの各ファイルを参照してください。
動作の面から考える構成図(ファイルの主従関係で階層のツリーではありません)
folder ud-team2ch
├ checkSono.pl
│ ├ require.pl
│ ├ checkGrid.pl
│ ├ sendmail.pl
│ │ ├ require.pl
│ │ ├ folder mail
│ │ │ └ hon.cgi
│ │ └ mail.pl
│ └ check_2ch.pl
│   ├ thred.tmpl
│   └ folder log
│      ├ check.txt
│      ├ pick.txt
│      ├ subject.txt
│      ├ board.txt
│      └ subject.tmp
folder HTML – HTML::AAモジュール格納用ディレクトリ。
folder subgrp – 板内チームのデータファイル格納用ディレクトリ。
folder log – データファイル専用ディレクトリ。
folder sono – 書庫の保存と、展開したファイル、実効ログを格納するディレクトリ。
├ checkSono.pl – 実行ファイル
├ require.pl – 共通ファイル
├ file.txt – (自動生成)ファイルリストの格納ファイル
└ result_zero.html – (自動生成)未提出板名HTMLファイル
手順
「checkSono.pl」を実行すると次の画面が現れます。
sample1
通常は1を選択します。後は放置です。
sample2
ファイルが更新されると、計算を開始します。
sample3
計算が終わると、自動でFTP送信します。
sample4
計算終了後は30分ごとに監視を行います。自動で終了はしません。
編集
Q.デザインを変更したい
A.テンプレートを利用しています。<TMPL…>というタグ以外は自由に変更できます。
サンプル(すでに休眠中)
http://ud-team2ch.penlabo.net/休眠用の保管アドレス
http://ud-team2ch.mine.nu/活動期のアドレス
ダウンロード
UDランキングスクリプトダウンロード
履歴
2008-08-30 www.penlabo.netに移動
2007/04/18版
取得後の”超”暴走の修正
2007/04/17版

取得後の暴走の修正

2007/02/26版
未公開バージョンというか、公開し忘れ…
2007/01/16版
ゼロ除算や、ランキング表示など掲示板に指摘のあった点を修正。
同じ処理をサブルーチン化
2006/12/23版
エラーメッセージを強化。
HTML::Template化。
矢印非表示で初が表示されていたのを修正。
板内チームで拡張設定の項目表示順番が反映されていなかったのを修正。
AA表示で、罫線の行の処理の時にサイズと行の計算がされていなかったのを修正。
板内チームの抽出を監視スクリプトで計算させ、結果をstat.cgiが参照するように変更。
処理系統の大幅な見直し。
配列関係を効率の良い多次元配列化。
まだまだ、改善や修正の余地有り。
2006/11/10版
2006/09/29版
指定日付の差が2日以上の際、順位変動の表示が正常でなかったのを修正しました。
コピペで順位の矢印を非表示にできる設定を追加しました。
板別、板内チーム別コピペのランキングで編集できる機能を追加しました。(今後全てに対応予定)。
判明している問題点:ユニークナンバーを指定したとき、ランキングのテーブル表示で、カンマ区切りが正常に行われない。

2006/09/10版
取得部:FTP接続に失敗した時にプロセスが死ぬのを回避。エラー判定処理を一部変更。CGI部:コピペ支援の達成にタイトルを表示する機能追加。罫線有り無し右閉じる全てで有効。切り取り線のサイズと行数の計算で最後の1行を無視していたのを修正。クッキー保存のバグ修正。byteの計算周りの修正と切り取りまでのサイズを表示。
2006/07/09版

板内チーム抽出方法を最適なものに変更。板別合計ランクで100件表示選択可能に。

2006/06/08版
アスキーアート計算をPerlで行うように。設定の保存方法を大幅に変更。他バグ修正など。
2006/04/29版
UD-Team2ch 404から、配布場所を移動

アイコン

アイコン画像は直リンクをせず、お持ち帰りの上ご利用ください。
配布元の表記は管理者にお任せします。
キャラクターの著作は各個人または団体が保有しております。
ご利用されたことにより発生する責任は一切負いません。

MMORPG「ストラガーデン

© 2004-2005 FromNetworks,Inc. © 2004-2005 DWANGO Co., Ltd.

  • フロッピー(うさぎ)05/06/08
  • チッチ(とり)05/06/08
  • ビッグラット(こあら)05/06/08
  • ルカントード(かえる)05/06/08
  • ピュアイ(とり)05/06/09
  • サポートレッド(ゲームマスター)05/06/09
  • クリフハーピー(はーぴー)05/06/09
  • ウィンプゴブリン(ごぶりん)05/06/13
  • グラススネーク(へび)05/06/13
  • メジィロ(甲殻系?)05/08/07

RPG「.hack

© Project .hack ©BANDAI 2002

  • プチグソ(謎の生物)05/06/08

ANIME「おじゃる丸

©犬丸りん・NHK・NEP

  • 電ボ(伝書蛍)05/06/09

WCGスクリプト改造着手

弄り始めました。
リザルト、ポイント、タイム、メンバーでソートされた上位300件のIDを抜き出し、
ID基準にデータを読みにいきます。

しかし、都合上問題が。
下の順位では誤差が発生します。
これはもうしょうがないかと。

データファイル丸ごと抜ければいいのだけど、
やり方は英語で聞かなきゃいけないらしく、
ラウンジでお願いしたけれど誰もやってくれなかったので、しょうがない。

もうちょっと時間がかかりそうです。