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

おさわがせしました

正直なところ、機能の追加に追加で、1つ弄ると別のところに影響が出てしまうようです。
また、こちらの想定外の使い方をしていることもあるみたいで、バグと思って昨日を正常化しても、それが逆に改悪となってしまうようです。

クッキーによる設定の変更なども、いろいろ問題が発生してしまっているようでうまくいきません。
手元には、細かな修正と機能追加の行われたスクリプトがあるものの、使えない機能が出るようなので(こちらでは確認できなかったのですが)、不本意ではありますが、巻き戻しいたしました。
もっと機能を追加したいのですが、1つのスクリプトで改修するには限界と考えます。

また、いい方法が見つかったときには、手を加えたいと思いますが、
いまはこれが精一杯です。
すいませんでした。

しっかりしろAmazon

先日、ネトゲアンテナのシステムメンテナンスを行っていました。
Amazonのアソシエイトをどうしようかとページをめくっていると・・・

いつのまにか、イメージのみで個別商品リンクが張れるようになっているではないか。
ふむふむ、タグはAタグで張れ、DOCTYPEにやさしい。画像は持ち帰ってくださいと。
これは使うしかないだろと、商品をちゃんと把握しているパンヤから修正を書けることにした。

ちょっと用事があってパソコンから離れて、Amazonに再ログインすると・・・
あれ?イメージのみがない?さっきのは幻?
いやいや、リンクは生きてるし間違いない。

自分の操作に問題があったのか、としばらく悩んでいたけれど、時間の無駄なのでAmazonに問い合わせることにした。
----------
Amazon.co.jpアソシエイト・プログラムにお問い合わせいただき、ありがとうござ
います。

誠に申し訳ございませんが、一時的に個別商品リンクの作成画面にて、掲載すべき予
定ではない機能が掲載されておりました。この表示についてはすでに削除されており
ます。このたびは、誤った機能を表示しており、大変ご迷惑をおかけいたしましたこ
とを、お詫びいたします。

その他にもご不明な点がございましたら、ご遠慮なくお問い合わせください。アソシ
エイト・プログラムをご利用いただき、ありがとうございます。
----------
な、なんだってー(AAry

どうしてくれるんだよ、イメージのみ専用にスクリプト修正し終わってるんですがorz

ブログパーツこっそりテスト

rank表記がほしいということで、昨日こっそり追加してみた。
ラウンジで報告していないにもかかわらず、要望をもらった。

ぁあ、ちゃんと見てるんだなぁ、と。
作った意味はあったなぁ、と。
応えなきゃなぁ、と。


桂小枝風に読まないこと。

てなわけで、またちょっと弄ってみました。
評価よろしく~

WCG ← ブログパーツのお知らせ

メンバー(個人)向けのブログパーツをちょっと前に作りました。
ここで公開

明日からの3連休で、もう一度調整します。

※改修予定項目
 → スタイルシートの整理
 → 利用者同士の交流を助ける、ウェブリング機能の実装

ちなみに、ブログじゃなくても、タグを貼り付ければ動きますよ。

GIMPでWeb素材を作ろう

完成画像

背景やボタンとしても使えそうで、今風(?)なWeb素材を作ってみましょう。
このような画像が作れるようになります。
文字を重ねると、ボタンらしくなりますね。
この解説で使用したバージョンは、2.2.4です。

実際に作ってみる

それでは、手順を追って作ってみましょう。

  1. 新規画像を作成します。
    手順1-1
    とりあえず、200×40というサイズで作ることにします。
    細かなサイズ指定は、慣れれば各自が判断できるでしょう。
    手順1-2
    問題なく作成されれば、こういうウィンドウが出現します。
  2. 基本とする色を塗ります。
    手順2
    ここでは、お気に入りの色である緑色を使いましたが、どのような色でもかまわないでしょう。
    ただし、濃い目のほうがいいかもしれません。
  3. グラデーションを塗るための準備をします。
    画像を全選択してください。
    手順3-1
    そして、選択領域の縮小で2px縮めます。
    手順3-2
    次に、角を丸めます。
    ここでは、半径を「50%」という設定で丸めます。
    好みで変更してもかまわないでしょう。
    手順3-3
    ここまで問題がなければ、このような状態になります。
  4. シャドウとなるグラデーションを塗ります。
    2枚目のレイヤーを作成します。
    手順4-1
    最上部になるように配置してください。
    手順4-2
    新規レイヤーへグラデーションで塗ります。
    「前景から透明に」を選択します。
    形状は「Linear」反復は「なし」です。
    手順4-3
    下から中間までを選択し、グラデーションで塗ります。
    ここまで問題がなければ、このような状態になります。
  5. ハイライトとなるグラデーションを塗ります。
    手順5-1
    減算選択で半分にします。
    手順5-2
    再び角を丸めます。
    半径を「100%」という設定で丸めます。
    もし、膨らむようなら設定値を「90%」などに減らします。
    手順5-3
    ここまで問題がなければ、このような状態になります。
  6. グラデーションの調整を行います。
    手順6-1
    グラデーションを塗ったレイヤーの透明度を「50%」に変更します。
    手順6-2
    うまくいけば、こういう状態になります。
    なんとなく、雰囲気が出てきたでしょうか。
    しかし、もうちょっと手を加えていきましょう。
  7. ボーダーを塗るための準備を行います。
    手順7
    画像全体を選択して、それから2px縮小します。
    選択領域を反転しておきます。
    今回、角は丸めません。
  8. ボーダーを塗ります。
    この手順は、一気に進めてしまいます。
    3枚目のレイヤーを作成します。
    手順8-1
    最上部になるように配置してください。
    手順8-2
    白色で描画色塗りします。
    画像の端2pxをすべて塗ってしまいます。
    作業しやすいように、表示倍率を800%に変更してあります。
    手順8-3
    画像全体を選択して、それから1px縮小します。
    選択領域を反転して、角もそのままです。
    黒色で描画色塗りします。
    画像の端1pxをすべて塗ってしまいます。
    手順8-4
    アクセントに、角の1pxを白色で塗っておきました。
  9. ボーダーの調整を行います。
    手順9-1
    3枚目のレイヤーをオーバーレイモードに変更します。
    手順9-2
    白色はハイライトっぽく、黒色はシャドウっぽくみえるようになります。
    手順9-3
    等倍で表示すると、こういう状態になります。

Web素材の完成

画像として書き出して完成です。
完成画像
透明度のある、それっぽい画像が出来上がりました。
パターン追加
背景とグラデーションの間にパターン塗りを加えてみました。
雰囲気が変わって、いい感じになります。
こういうWeb素材が使われているのを、よく見かけると思います。

自分で作るのが面倒な方へ

ここで使用したデータファイルをお使いください。
背景画像の色を変えるだけで、いろんなパターンの素材が作れることと思います。
ダウンロードで内容を表示してしまうブラウザの場合には、右クリックメニューから対象を保存してください。
Photoshopでは、こういった作業をマクロにしてしまえば、いろんなサイズでも自動的に作れます。
しかし、GIMPではマウス操作の記録という機能がなく、スクリプトをコーディングしなければなりません。
自動化できるようになるのは、いつになることでしょう…。

更新履歴

2008/04/14
サイト移動に伴うHTMLの修正(旧URI:[廃止])
2007/11/16
公開

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