技術ブログ - 毎日が成長!

2009年4月 のアーカイブ

よろしい、ならばxmlstarletだ

2009年4月28日 火曜日

どうも、サーバーワークスでプログラマさせてもらっている川口です。

みなさん、シェルスクリプト書いてますか?コマンドラインの延長みたいなものなので欲張って色んな動作をさせようとすると非常に面倒なんですが、一度書いておけば様々な作業が一気に楽にそして正確に行えるようになるので重宝します。

今回紹介するのはコマンドライン上で動作するオープンソースのXMLツール xmlstarletです。コマンドラインでXMLをいじれるのでシェルスクリプトとも相性バッチリ。インストールも簡単、かつ対応形式も主要なのは押さえており機能面でも通常使用なら問題ないレベルなので是非試して見て下さい。

xmlstarletとは?

コマンドラインからXMLの書式化、変換、修正、および編集を行う事ができる様になるツールキットです。シェルスクリプト作成時にコマンドラインからXML文法チェックやパースの必要がある場合に、PHPやperlでわざわざコードを書かなくても対応できるようになります。

ちなみに使用にはlibxml2およびlibxsltライブラリーが必要です。

MacPortsで検索

% sudo port search xmlstarlet
xmlstarlet @1.0.1 (textproc)
    xml command line utilities

インストール

特に注意する点は有りません。MacPortsコマンドでそのままインストールしてください。

(今回のインストール環境)

  • Mac OS X 10.5.6
  • MacPorts 1.700

    % sudo port install xmlstarlet

確認

% port contents xmlstarlet
Port xmlstarlet contains:
  /opt/local/bin/xmlstarlet
  /opt/local/share/man/man1/xmlstarlet.1.gz

使用方法

今回は簡単な文法チェックが目的でしたのでバリデートのwell-formed形式で試してみます。その他のパリデート定義形式は以下のような形式(スキーマ言語)。(もしかしたらオプションで表示されないだけでもっと多いかも・・・)

  • DTD
    • 元々SGMLのスキーマ言語として開発された文書構造(文書型)定義スキーマ言語
  • RELAX NG
    • RELAX NG 技術委員会が策定したスキーマ言語
  • XSD
    • W3Cが開発・標準化にあたっているスキーマ言語
  • well-formed
    • W3Cが定めた整形XML文書形式

正常なXMLデータの場合

% xmlstarlet val -w test.xml
ptest.xml - valid

1. 「homepage」 -> 「homepega」等のタイプミス

(test.xml)

<?xml version="1.0" encoding="EUC-JP"?>
<company_list>
    <company>
        <name>株式会社サーバーワークス</name>
        <address>東京都文京区音羽1丁目26-11 大和出版ビル2F, 3F</address>
        <tel>03-5940-3282</tel>
        <fax>03-5940-3548</fax>
        <homepega>http://www.serverworks.co.jp</homepage>
        <email>sales@serverworks.co.jp</email>
    </company>
</company_list>

(実行結果)

% xmlstarlet val -w test.xml
test.xml:8: parser error : Opening and ending tag mismatch: homepega line 8 and homepage
    <homepega>2363</homepage>
                             ^
test.xml - invalid

2. ‘<’ or ‘>’ 等のタグ閉じ忘れ

(test2.xml)

<?xml version="1.0" encoding="EUC-JP"?>
<company_list>
    <company>
        <name>株式会社サーバーワークス</name>
        <address>東京都文京区音羽1丁目26-11 大和出版ビル2F, 3F</address>
        <tel>03-5940-3282</tel>
        <fax>03-5940-3548</fax>
        <homepage>http://www.serverworks.co.jp</homepage>
        <email>sales@serverworks.co.jp</email>
    </company
</company_list>

(実行結果)

% xmlstarlet val -w test2.xml
test.xml:11: parser error : expected '>'
</company_list>
^
test2.xml - invalid

参考リンク

LinuxでlibHaruを使ったPDF生成を行う

2009年4月1日 水曜日

前回のlibHaruを使ったPDFの生成はMac OS X上での作業でしたので、今回はサーバサイド、CentOS 5.2上でlibHaruを使ったPDF生成をしてみます。

インストール

まず、gccとPHPがインストールされていない場合はあらかじめインストールしておきます。PHPはmbstringモジュール、開発用パッケージ、PEARも必要となるので、php-develとphp-pearもインストールします。

# yum -y install gcc php php-mbstring php-devel php-pear

次に、libHaruのビルドに必要なzlibとlibpngの2つのライブラリをインストールします。

# yum -y install zlib zlib-devel libpng libpng-devel

準備が整ったら、libHaruのソースコードを取得してビルドおよびインストールを行います。

# wget http://libharu.org/files/libharu-2.1.0.tar.gz
# tar xvf libharu-2.1.0.tar.gz
# cd libharu-2.1.0
# ./configure
# make
# make install
# make clean

libHaruのインストールが完了したら、前回と同様にPECLのharuモジュールをインストールします。

# pecl install haru
downloading haru-1.0.0.tgz ...
Starting to download haru-1.0.0.tgz (23,336 bytes)
........done: 23,336 bytes
4 source files, building
running: phpize
Configuring for:
PHP Api Version:         20041225
Zend Module Api No:      20050922
Zend Extension Api No:   220051025
Please provide the prefix of libharu installation [autodetect] : /usr/local

libHaruのインストール先を尋ねられるので、上記のように/usr/localと入力します。

Build process completed successfully
Installing '/var/tmp/pear-build-root/install-haru-1.0.0//usr/lib/php/modules/haru.so'
install ok: channel://pecl.php.net/haru-1.0.0
You should add "extension=haru.so" to php.ini

設定

ビルドが完了すると/usr/lib/php/modules/haru.soが生成されるので、/etc/php.iniに以下の内容を追加します。

extension=haru.so

使用例

前回と同様のコードを作成して、実行してみます。

<?php
// ドキュメントインスタンスを生成する
$doc = new HaruDoc;

// 日本語エンコーディングを利用する
$doc->useJPEncodings();

// 日本語フォントを利用する
$doc->useJPFonts();

// ドキュメントに新しいページを追加する
$page = $doc->addPage();

// ページのサイズと向きを設定する
$page->setSize(HaruPage::SIZE_A4, HaruPage::LANDSCAPE);

// 明朝体をCP932エンコーディングで利用する
$font = $doc->getFont('MS-Mincyo', '90ms-RKSJ-H');

// フォントのサイズを設定する
$page->setFontAndSize($font, 60);

// 塗の色を設定する
$page->setRGBFill(0, 0, 0);

// 文字を出力する
$page->beginText();
$page->textOut(210, 270, mb_convert_encoding('テストです。', 'SJIS-win', 'UTF-8'));
$page->endText();

// 結果をPDFファイルに保存する
$doc->save('./test.pdf');

今回は明朝体を使ってみました(フォント名の指定はMincyoとします)。

libharu

というわけで、Linuxの場合も実に簡単に日本語PDFを生成することができました。