Author: Atsushi Konno
Date: Last modified: Fri May 16 22:32:45 JST 2008

Powered by SmartDoc

# mod_chxj

Last modified: Fri May 16 22:32:45 JST 2008
Atsushi Konno

## 目次

## Overview

mod_chxjはオープンソースの携帯向けコンテンツ変換Apache2.x用モジュールであり、CHTML（DoCoMo i-Mode用CHTML5.0)で記述された文書や通常のHTMLで記述された文書を、アクセスに来た端末のUser-Agentヘッダを見て、それぞれの端末にあった形式に変換します。HTML文書に限らず、画像（jpg、gif、png）、絵文字についても、定義ファイルに従ってそれぞれのキャリアにあった絵文字に変換します。Cookie非対応端末、Refer非対応端末のために、Set-Cookie、CookieヘッダやRefererヘッダをシミュレートすることもできます。

## インストール

### 準備

mod_chxjをインストールする前に、下記のものを用意する必要があります。

1. Apache2.xのヘッダーファイル群
2. Apache2.x用のapxs
3. apr(Apache Portable Runtime)ライブラリとそのヘッダファイル郡(apu含む)
4. automake、autoconf、libtool1.3.X
5. ImageMagick(MagickWand)
6. memcachedを使用する場合にはlibmemcached 0.20以降
7. mysqlを使用する場合にはlibmysqlclient 4.1.11a以降
8. Linux

### mod_chxjの入手

mod_chxjはこちらからダウンロードすることができます。

### インストール

以下にmod_chxjインストール手順を示します。

1. Configureスクリプトを生成します

   Configure スクリプトの生成

       $ ./buildconf.sh

   (1)

2. Configure

   Configure

       $ ./configure

   (2)(3)

3. mod_chxj.soを生成します
   make

       $ make

4. apacheにインストールします
   install

       $ make install

5. データの設置etcディレクトリは以下のdevice_data.xmlとemoji.xmlをApacheからアクセスできるところに配置します。

   以下、/etc/apache2/chxjディレクトリにchxj用設定ファイルを用意する場合

   データの設置

       $ mkdir -p /etc/apache2/chxj
       $ cp etc/device_data.xml /etc/apache2/chxj
       $ cp etc/emoji.xml /etc/apache2/chxj

1. "$"はプロンプトをあらわします。
2. 場合によっては--with-apr-configや--with-apu-config、--with-pcre-configも必要です。
3. 詳細はBuildを参照

## Build

mod_chxjをコンパイルするにはconfigureを行う必要があります。以下にconfigureのオプションを記します。

### メイン

### --with-apache-header

通常指定する必要はありません。configureでApacheのヘッダファイルの場所が検知できなかった場合や、任意のApacheヘッダファイルを使用したい場合に指定します。

--with-apache-header

             $ ./configure --with-apache-header=/usr/include/apache2

上記は/usr/include/apache2以下にApacheのヘッダファイルがある場合の例です。

### --with-apxs

通常指定する必要はありません。configureでapxsを検知できなかった場合や、任意のapxsプログラムを指定したい場合に指定します。

--with-apxs

             $ ./configure --with-apxs=/usr/local/apache2/bin/apxs2

上記は/usr/local/apache2/bin/apxs2を使用するようにapxsに指定しています。

### --with-apr-config

通常指定する必要はありません。configureでapr-configを検知できなかった場合や、任意のapr-configプログラムを指定したい場合に指定します。

--with-apr-config

    $ ./configure --with-apr-config=/usr/local/apache2/bin/apr-1-config

上記は/usr/local/apache2/bin/apr-1-configを使用するように指定しています。

### --with-apu-config

通常指定する必要はありません。configureでapu-configを検知できなかった場合や、任意のapu-configプログラムを指定したい場合に指定します。

--with-apu-config

    $ ./configure --with-apu-config=/usr/local/apache2/bin/apu-1-config

上記は/usr/local/apache2/bin/apu-1-configを使用するように指定しています。

### Cookieシミュレート機能でMySQLを使用する場合

### --enable-mysql-cookie

Cookieシミュレート機能を使用する際、保存先をデフォルトのDBMでは無く、MySQLに保存するようにします。DefaultのDBMで良い場合や、Cookieシミュレート機能を使用しない場合は指定する必要はありません。別途MySQLサーバを用意する必要があります。また、本オプションを指定した場合は、--with-mysql-header、--with-mysql-lib-dirも指定します。これはMySQLのヘッダとライブラリが必要なことを意味します。使用するMySQLのライブラリは今のところlibmysqlclient_r.soのみです。

--enable-mysql-cookie

    $ ./configure --enable-mysql-cookie --with-mysql-header=/usr/include/mysql \
        --with-mysql-lib-dir=/usr/lib

上記は、/usr/include/mysql以下にmysql用のヘッダがあり、/usr/lib以下にlibmysqlclient_r.soがある場合の例です。

### --with-mysql-header

--enable-mysql-cookieを指定した場合は必須です。MySQLのヘッダファイルの場所を指定します。

--with-mysql-header

    $ ./configure --enable-mysql-cookie --with-mysql-header=/usr/include/mysql \
        --with-mysql-lib-dir=/usr/lib

### --with-mysql-lib-dir

--enable-mysql-cookieを指定した場合は必須です。MySQLのライブラリ、libmysqlclient_r.soの設置されているディレクトリを指定します。

--with-mysql-lib-dir

    $ ./configure --enable-mysql-cookie --with-mysql-header=/usr/include/mysql \
        --with-mysql-lib-dir=/usr/lib

### Cookieシミュレート機能でmemcachedを使用する場合

### --enable-memcache-cookie

Cookieシミュレート機能を使用する際、保存先をデフォルトのDBMでは無く、memcachedに保存するようにします。DefaultのDBMで良い場合や、Cookieシミュレート機能を使用しない場合は指定する必要はありません。別途memcachedを用意する必要があります。また、本オプションを指定した場合は、--with-memcached-header、--with-memcached-lib-dirも指定します。これはlibmemcachedのヘッダとライブラリが必要なことを意味します。

--enable-memcache-cookie

    $ ./configure --enable-memcache-cookie \
        --with-memcached-header=/usr/include/libmemcached \
        --with-memcached-lib-dir=/usr/lib

上記は、/usr/include/libmemcached以下にlibmemcached用のヘッダがあり、/usr/lib以下にlibmemcached.soがある場合の例です。

### --with-memcached-header

--enable-memcache-cookieを指定した場合は必須です。libmemcachedのヘッダファイルの場所を指定します。

--with-memcached-header

    $ ./configure --enable-memcache-cookie \
        --with-memcached-header=/usr/include/libmemcached \
        --with-memcached-lib-dir=/usr/lib

### --with-memcached-lib-dir

--enable-memcache-cookieを指定した場合は必須です。libmemcachedのライブラリ、libmemcached.soの設置されているディレクトリを指定します。

--with-memcached-lib-dir

    $ ./configure --enable-memcache-cookie \
        --with-memcached-header=/usr/include/libmemcached \
        --with-memcached-lib-dir=/usr/lib

## Configuration

以下はmod_chxjが/usr/lib/apache2/modulesディレクトリ配下に設置されたものとしています

### htmlファイルが変換対象の場合

例として、Locationが"/chxj"以下のものは全て変換する場合を説明します。

1. httpd.confに以下を追加します。
   httpd.conf

       #====================================================================================
       # モジュールをApache2.xにロード
       #====================================================================================
       LoadModule chxj_module /usr/lib/apache2/modules/mod_chxj.so

       #====================================================================================
       # デバイスデータファイルの設定
       #====================================================================================
       ChxjLoadDeviceData  /etc/apache2/chxj/device_data.xml

       #====================================================================================
       # 絵文字データファイルの設定
       #====================================================================================
       ChxjLoadEmojiData   /etc/apache2/chxj/emoji.xml

       #====================================================================================
       # 変換エンジン動作指示命令
       # ChxjConvRule ==> ディレクティブ
       # "^/chxj.+$"  ==> Perl互換のURIパターン
       # EngineOn     ==> 変換エンジンを動作させる指示
       # NONE         ==> サーバ側の文字コード。（NONEを指定した場合は文字コード変換しない)
       #====================================================================================
       ChxjConvertRule "^/chxj.+$" "EngineOn" "NONE"

2. apacheの再起動。

### php等の出力結果が変換対象の場合

1. httpd.confに以下を追加します
   httpd.conf

       #====================================================================================
       # モジュールをApache2.xにロード
       #====================================================================================
       LoadModule chxj_module /usr/lib/apache2/modules/mod_chxj.so

       #====================================================================================
       # デバイスデータの設定
       #====================================================================================
       ChxjLoadDeviceData  /etc/apache2/chxj/device_data.xml

       #====================================================================================
       # 絵文字データの設定
       #====================================================================================
       ChxjLoadEmojiData   /etc/apache2/chxj/emoji.xml

       #====================================================================================
       # 変換エンジン動作指示命令
       # ChxjConvRule ==> ディレクティブ
       # "^/chxj.+$"  ==> Perl互換のURIパターン
       # EngineOn     ==> 変換エンジンを動作させる指示。動作させたく無い場合は"EngineOff"
       # EUC-JP       ==> サーバ側の文字コード。（NONEを指定した場合は文字コード変換しない)
       #                  EUC-JPからCP932に文字コード変換します。
       #====================================================================================
       ChxjConvertRule "^/chxj.+$" "EngineOn" "EUC-JP"

2. apacheの再起動。

### xoopsを使用し、且つwordpress、bwikiを使用している場合

1. httpd.confに以下を追加します
   httpd.conf

       #====================================================================================
       # モジュールをApache2.xにロード
       #====================================================================================
       LoadModule chxj_module /usr/lib/apache2/modules/mod_chxj.so

       #====================================================================================
       # デバイスデータの設定
       #====================================================================================
       ChxjLoadDeviceData  /etc/apache2/chxj/device_data.xml

       #====================================================================================
       # 絵文字データの設定
       #====================================================================================
       ChxjLoadEmojiData   /etc/apache2/chxj/emoji.xml

       #====================================================================================
       # 変換エンジン動作指示命令
       #====================================================================================
       #====================================================================================
       # bwikiの設定をします。bwikiではどうもxoopsヘッダの文字コードとbwiki内での携帯スキン
       # の文字コードが一致していないようなので、bwiki内で文字コードを変換させないように
       # 修正後、以下のルールを記述します。
       #
       # ChxjConvRule           ディレクティブ
       # "^/modules/bwiki.+$"   このルールを適用したいURIパターン
       # "EngineOn"             変換エンジンを有効にします。
       # "EUC-JP"               出力時にEUC-JPからCP932に変換させます。
       # "PC"                   変換元HTMLはPCサイト用HTMLです。
       # "DoCoMo/1.0/D501i"     DoCoMo端末としてbwikiにアクセスさせます。
       #
       #====================================================================================
       ChxjConvertRule "^/modules/bwiki.+$" "EngineOn" "EUC-JP" "PC" \
           "DoCoMo/1.0/D501i"

       #====================================================================================
       # wordpressの設定をします。
       #
       # ChxjConvRule               ディレクティブ
       # "^/modules/wordpress.+$"   このルールを適用したいURIパターン
       # "EngineOn"                 変換エンジンを有効にします。
       # "NONE"                     出力時に文字コード変換をさせません。
       # "NONE"                     変換元HTMLはPCサイト用HTMLではありません。
       # "DoCoMo/1.0/D501i"         DoCoMo端末としてwordpressにアクセスさせます。
       #
       #====================================================================================
       ChxjConvertRule "^/modules/wordpress/.*$" "EngineOn" "NONE" "PC" \
           "DoCoMo/1.0/D501i"

       #====================================================================================
       # その他の設定をします。
       #
       # ChxjConvRule               ディレクティブ
       # "^/.+$"                    このルールを適用したいURIパターン
       # "EngineOn"                 変換エンジンを有効にします。
       # "EUC-JP"                   出力時にEUC-JPからCP932に文字コード変換をさせます。
       #
       #====================================================================================
       ChxjConvertRule "^/.+$" "EngineOn" "EUC-JP"

       <Location />
         ChxjImageEngine On
         AllowOverride All
       </Location>

2. apacheの再起動。

### 画像自動変換機能を使用する場合

1. httpd.confに以下を追加します。下記は、URIが/imgで始まる全ての画像に対して動作するようmod_chxjに指示しています。

   httpd.conf

       <Location /img>
       ChxjImageEngine On
       ChxjImageCacheDir /tmp
       ChxjImageCopyright "A.Konno"
       </Location>

   上記の説明を以下に示します。

   1. ChxjImageEngine
      mod_chxjの画像変換ハンドラを起動するよう指示しています。DefaultはOff

   2. ChxjImageCacheDir
      mod_chxj画像変換ハンドラが使用する変換後の画像をおいておくディレクトリを指定します。デフォルトは/tmp。

      ChxjImageCacheDir

                ChxjImageCacheDir /tmp

      mod_chxjに画像変換キャッシュとして/tmpを使用するよう指示します。

   3. ChxjImageCacheLimit
      mod_chxj画像変換ハンドラが使用する変換後の画像をおいておくディレクトリの許容量を指定します。単位はbyte。

      ChxjImageCacheLimit

                ChxjImageCacheLimit 1024

      mod_chxjに画像変換キャッシュ最大サイズとして1kbyteと指定。※このとき変換結果が1kbyte以上あるような場合にはINTERNAL_SERVER_ERRORを返します。十分な領域を確保するか、画像サイズを小さくしてください。

   4. ChxjImageCopyright
      mod_chxjの画像変換ハンドラに、転送禁止設定を行うよう指示します。パラメータとして任意の文字列をとります。ChxjImageCopyrightディレクティブで指定された文字列は、それぞれのイメージのコメント部に埋め込まれます。

      ChxjImageCopyright

                ChxjImageCopyright "A.Konno"

      mod_chxjに転送禁止設定を行うよう指示しています。変換後イメージのコメント部分には、キャリア毎に以下の文字列を埋め込みます。

      AU の場合

      AU

                 kddi_copyright=on,A.Konno

      DoCoMoの場合

      DoCoMo

          copy="NO",A.Konno

      SoftBank/Vodafoneの場合は、レスポンスヘッダに

      SoftBank/Vodafone/J-PHONE

                   x-jphone-copyright:no-transfer

      を埋め込みます。(4)

1. SoftBank/Vodafoneの場合は、リクエストＵＲＬの最後が.pnzか、.jpzで終わるようにダミーを付けなければなりません。

### 文字コードを変換したい場合(EXPERIMENTAL)

1. httpd.confに以下を追加します。下記は、URIが/chxjで始まる全てのコンテンツに対して動作するようmod_chxjに指示しています。サーバ側はEUC-JPであった場合の例です。mod_chxjによってSJISに変換するように指示しています。サーバ側がShift_JISで無い場合は、Shift_JISコードの10進参照文字列表記を記述することによってShift_JISコードの絵文字2バイトコードに変換しクライアントへ返します。

   httpd.conf

       ChxjConvRule "^/chxj.+$" "EngineOn" "EUC-JP"

   上記の説明を以下に示します。

   1. ChxjConvertRule
      サーバサイドの文字コードを指定します。ここに、EUC-JPと指定してあった場合は、EUC-JPからCP932に変換後、クライアントに出力されます。省略した場合はNONE

      1. 変換エンジン動作指示命令
         ChxjConvertRule ==>ディレクティブ
         "^/chxj.+$" ==> Perl互換のURIパターン
         EngineOn ==>変換エンジンを動作させる指示。動作させたく無い場合は"EngineOff"
         EUC-JP ==>サーバ側の文字コード。（NONEを指定した場合は文字コード変換しない)
         EUC-JPからCP932に文字コード変換します。(glibc/iconvに依存します)

### ディレクティブ

1. ChxjLoadDeviceData
   デバイス定義ファイルを指定します。
   ex)

           ChxjLoadDeviceData /etc/apache2/device.xml

2. ChxjLoadEmojiData
   絵文字変換定義ファイルを指定します。
   ex)

           ChxjLoadEmojiData   /etc/apache2/chxj/emoji.xml

3. ChxjImageEngine
   画像変換エンジンを有効にします。パラメータとしてOnとOffを指定できます。DefaultはOffです。
   ex)

           ChxjImageEngine On

4. ChxjImageCacheDir
   イメージの一時ファイル保存場所を指定します。
   ex)

           ChxjImageCacheDir   /tmp

5. ChxjImageCacheLimit
   イメージの一時ファイル保存許容量を指定します。下記は1MByteの例。
   ex)

           ChxjImageCacheLimit   1048576

6. ChxjImageCopyright
   イメージに著作権情報を付与します。
   ex)

           ChxjImageCopyright   "chosakuken jyoho"

7. ChxjConvertRule
   HTML変換エンジンの適用ルールを記述します。本ディレクティブを使用し、変換エンジンのOn|Offを指定します。DefaultはOFFです。また、ルールは記述された順番に評価し、マッチするものがあれば、その時点で対象ルールを適用します。パラメータは3つ必要です。下記にパラメータを記します。

   パラメータ
   第1パラメータ | URIを評価するPerl互換の正規表現を指定します
   第2パラメータ | HTML変換エンジンのOn|Offを指定します。Onの場合は"EngineOn"。Offの場合は"EngineOff"を指定します。"EngineOn|EngineOff"の他に"CookieOn|CookieOff"を指定することもできます。複数指定する場合は","で区切って指定します。
   第3パラメータ | 文字コードを指定します。ここで指定した文字コードから"CP932"に変換します。指定できる文字コードはiconv -lコマンドによって確認することができます。変換しなくて良い場合はNONEを指定してください。
   第4パラメータ | 省略した場合は、携帯ページからの変換を意味します。PC用ページからの変換を行う場合は"PC"を第四パラメータに指定します。
   第5パラメータ | サーバサイドアプリケーションに渡すUser-Agentを指定します。例えば、wordpress等のようにCHTMLを出力するアプリケーションがある場合は、"DoCoMo/1.0/N501i"等適当なUser-Agentを指定することによって、アプリケーションにCHTMLを出力するように指示することができます。ここで指定したUser-AgentはHTML出力時には評価されません。

   ex)

           ChxjConvertRule "^/chxj.+$/" EngineOn EUC-JP

8. ChxjCookieDir
   クッキー保存先をdbmにする場合（デフォルト）指定します。クッキーの内容を保存するディレクトリを指定します。指定しない場合は/tmpに保存されます。

   ex)

           <Location />
             ChxjCookieDir   /tmp
           </Location>

   詳細は「Cookieシミュレート機能」の項を参照ください。

9. ChxjCookieTimeout
   クッキーを使用する場合に指定します。クッキーの保持期間を秒単位で指定します。指定しない場合は、1800秒でクッキーデータを破棄します。

   ex)

           <Location />
             ChxjCookieTimeout 10
           </Location>

   詳細は「Cookieシミュレート機能」の項を参照ください。

10. ChxjCookieStoreType
    クッキー保存先を指定します。指定できるものは以下のとおり。

    保存先
    値 | 意味 | 指定例
    "dbm" | dbmを選択します。 | ChxjCookieStoreType "dbm"
    "mysql" | mysqlを選択します。有効にするにはconfigure時にMYSQL COOKIE機能を有効にする必要があります | ChxjCookieStoreType "mysql"
    "memcache" | memcacheを選択します。有効にするにはconfigure時にMEMCACHE COOKIE機能を有効にする必要があります | ChxjCookieStoreType "memcache"

11. ChxjCookieMysqlHost
    MySQLサーバの動作するホストを指定します。

    ChxjCookieMysqlHostの例

                 ChxjCookieMysqlHost "localhost"

    詳細は「Cookieシミュレート機能」の項を参照ください。

12. ChxjCookieMysqlPort
    MySQLサーバのポート番号を指定します。

    ChxjCookieMysqlPortの例

                 ChxjCookieMysqlPort 3306

    詳細は「Cookieシミュレート機能」の項を参照ください。

13. ChxjCookieMysqlDatabase
    MySQLサーバのデータベース名を指定します。

    ChxjCookieMysqlDatabaseの例

                 ChxjCookieMysqlDatabase "test_db"

    詳細は「Cookieシミュレート機能」の項を参照ください。

14. ChxjCookieMysqlUsername
    MySQLサーバに接続する際に使用するユーザ名を指定します。

    ChxjCookieMysqlUsernameの例

                 ChxjCookieMysqlUsername "roottest"

    詳細は「Cookieシミュレート機能」の項を参照ください。

15. ChxjCookieMysqlPassword
    MySQLサーバに接続する際に使用するパスワードを指定します。

    ChxjCookieMysqlPasswordの例

                 ChxjCookieMysqlPassword "pwtest"

    詳細は「Cookieシミュレート機能」の項を参照ください。

16. ChxjCookieMysqlSocketPath
    MySQLのソケットパスを指定します。

    ChxjCookieMysqlSocketPathの例

                 ChxjCookieMysqlSocketPath  "/tmp/mysql.sock"

    詳細は「Cookieシミュレート機能」の項を参照ください。

17. ChxjCookieMysqlCharset
    MySQLのエンコードを指定します。

    ChxjCookieMysqlCharsetの例

                 ChxjCookieMysqlCharset  "utf8"

    詳細は「Cookieシミュレート機能」の項を参照ください。

18. ChxjCookieMysqlTablename
    MySQLのクッキーを保存するテーブル名を指定します。

    ChxjCookieMysqlTablenameの例

                 ChxjCookieMysqlTablename  "chxj_cookie"

    上記のように"chxj_cookie"と指定すると、実際に作成されるテーブルは、chxj_cookieとchxj_cookie_expireテーブルの2つになります。詳細は「Cookieシミュレート機能」の項を参照ください。

19. ChxjCookieMemcacheHost
    memcachedの動作するホストを指定します。

    ChxjCookieMemcacheHostの例

                 ChxjCookieMemcacheHost "localhost"

    詳細は「Cookieシミュレート機能」の項を参照ください。

20. ChxjCookieMemcachePort
    memcachedのポート番号を指定します。

    ChxjCookieMemcachePortの例

                 ChxjCookieMemcachePort 11211

    詳細は「Cookieシミュレート機能」の項を参照ください。

## 対応するCHTMLタグ

変換可能なCHTMLタグは以下のとおりです。

対応タグ一覧
タグ | 属性 | 備考
--- | --- | ---
<!-- --> |  | 無視します。
<A> |  |
| name | HDMLでは無視します
| href |
| accesskey |
<BASE> |  | HDMLでは無視します
| href | HDMLでは無視します
<BODY> |  | HDMLでは無視します
| bgcolor | HDML,CHTML1.0では無視します
| text | HDML,CHTML1.0では無視します
| link | HDML,CHTML1.0では無視します
| alink | HDML,XHTML,CHTML1.0,CHTML2.0,CHTML3.0,JHTML,JXHTMLでは無視します。0.12.0以降で対応
| vlink | HDML,XHTML,CHTML1.0,CHTML2.0,CHTML3.0,JHTML,JXHTMLでは無視します。0.12.0以降で対応
<BLINK> |  | HDML,CHTML1.0では無視します。0.11.0以降で対応
<BLOCKQUOTE> |  | 0.11.0以降で対応
<BR> |  |
| clear | HDMLでは無視します。0.11.0以降で対応
<CENTER> |  |
<DIR> |  | 0.11.0以降で対応
| type | HDML,CHTML1.0,CHTML2.0,CHTML3.0,JHTMLでは無視します。0.12.0以降で対応
<DL> |  | HDMLでは無視します。0.11.0以降で対応
<DT> |  | 0.11.0以降で対応。必ずタグは閉じてください
<DD> |  | 0.11.0以降で対応。必ずタグは閉じてください
<DIV> |  |
| align |
<FONT> |  | HDML,CHTML1.0では無視します
| color | HDML,CHTML1.0では無視します
| size | 0.12.0以降で対応。HDML,CHTML1.0,CHTML2.0,CHTML3.0,CHTML4.0では無視します。
<FORM> |  |
| action |
| method | HDMLでは無視します
<Hn> |  | HDML,JHTMLではalignのみ有効。0.11.0以降で対応
| align | HDML,JHTMLではalignのみ有効。0.11.0以降で対応
<HR> |  |
| align | HDMLでは無視します。
| size | HDMLでは無視します。
| width | HDMLでは無視します。
| color | HDML,CHTML1.0,CHTML2.0,CHTML3.0では無視します。0.12.0以降で対応
<HTML> |  | 属性を指定した場合は無視されます
<IMG> |  |
| src |
| align |
| width |
| height |
| hspace | JHTMLでは無視します。
| vspace | JHTMLでは無視します。
| alt |
<INPUT> |  |
| name |
| type | text,password,hidden,radio,checkbox,submit,resetに対応
| value |
| istyle |
| size | HDMLでは無視します。
| maxlength |
| checked | HDMLでは非対応。
| accesskey |
<LI> |  |
| type | 0.11.0以降で対応。HDML,CHTML1.0では無視します。
| value | 0.11.0以降で対応。HDML,CHTML1.0では無視します。
<MENU> |  | 0.11.0以降で対応。HDMLでは無視します。
| type | HDML,CHTML1.0,CHTML2.0,CHTML3.0,JHTMLでは無視します。0.12.0以降で対応
<MARQUEE> |  | 0.11.0以降で対応。HDML,CHTML1.0,XHTMLでは無視します。
| direction | 0.11.0以降で対応。HDML,CHTML1.0,XHTMLでは無視します。
| behavior | 0.11.0以降で対応。HDML,CHTML1.0,XHTMLでは無視します。
| loop | 0.11.0以降で対応。HDML,CHTML1.0,XHTML,JHTMLでは無視します。
| bgcolor | 0.12.0以降で対応。HDML,CHTML1.0,CHTML2.0,CHTML3.0,CHTML4.0,JHTMLでは無視します。
<OL> |  | 0.11.0以降で対応。HDMLでは無視します。
| type | 0.11.0以降で対応。HDML,CHTML1.0では無視します。
| start | 0.11.0以降で対応。HDML,CHTML1.0では無視します。
<SELECT> |  |
| name |
| size | HDMLでは無視します
| multiple | HDML,CHTML1.0では無視します。0.11.0以降で対応
<OPTION> |  | 必ずタグは閉じてください
| value |
| selected | HDMLでは無視します
<P> |  | HDMLではalignのみ有効。
| align | 0.11.0以降で対応。
<PLAINTEXT> |  | 0.11.0以降で対応。
<PRE> |  | HDMLは0.11.0以降で対応。
<TEXTAREA> |  |
| name |
| rows |
| cols |
| accesskey | 0.11.0以降で対応。
| istyle | 0.11.0以降で対応。
<META> |  |
| http-equiv | CHTML1.0,HDMLでは無視されます
| content | CHTML1.0,HDMLでは無視されます
<HEAD> |  | 属性を指定した場合は無視されます
<TITLE> |  | 属性を指定した場合は無視されます
<UL> |  | 0.11.0以降で対応。
| type | HDML,CHTML1.0,CHTML2.0,CHTML3.0,JHTMLでは無視します。0.12.0以降で対応
<CHXJ:IF> | lang | lang属性には"chtml","xhtml","hdml","jhtml","jxhtml"が指定できます。(jxhtmlは0.12.0以降で対応)

上記以外のタグは全て無視します。

## 独自拡張タグ

1. <CHXJ:IF>

   <CHXJ:IF>タグと</CHXJ:IF>タグではさまれたタグやテキストは、変換せずにそのまま(5)出力します。必須の属性としてlangがあります。lang属性を指定することによって、例えば、「HDML機の場合のみ出力させる」といったことを可能にします。
   ex)

   HTML文書中にHDML機の場合のみ有効にしたいタグ、または文書がある場合

              <CHXJ:IF lang="HDML" >
                <NODISPLAY>
       <ACTION TYPE=ACCEPT TASK=GOSUB \
           DEST='device:data/dnld?url=abc&name=abc.jpg&size=100&disposition=devjaww&title=test'> \
                </NODISPLAY>
              </CHXJ:IF>

   ex)

   i-Modeのみ出力したい文書がある場合

              <CHXJ:IF lang="chtml" >
                シークレットコードがどーのこーの。
              </CHXJ:IF>

   また、lang属性は、複数指定することも可能です。

   HDML機,J-PHONE機は以下を出力します

              <CHXJ:IF lang="chtml" lang="jhtml">
              あなたの携帯は、HDML機かJ-HTML機です。
              </CHXJ:IF>

1. 変換しませんので注意が必要です

## 絵文字について

i-Mode用の絵文字を書いておけば、アクセスしたキャリアによって、mod_chxjが対応の絵文字に自動変換します。ソースに2byteのバイナリコードを直接書いても、10進参照文字列(6)（&#XXX;の形）で書いても、どちらでも変換対象になります。１０進参照文字列で書いた場合は、mod_chxjにより、自動で２バイトコードに変換します。

1. 16進参照文字列には対応していません

### 絵文字変換定義

絵文字の変換に関する動作を変えたい場合（例えば「ハートがあったら、auの場合はスペードに」とか、「変換定義がおかしい」といった場合）は、emoji.xmlファイルを直接編集することによって定義を変更することが可能です。emoji.xmlはXMLファイルとなっていますので、vi等で簡単に定義を変更することができます。

以下に、emoji.xmlファイルの一部を記します。

emoji.xml

    <?xml encoding="Shift_JIS" >

    <emoji>
      <set>
        <no>1</no>
        <imode>
          <hex1>f8</hex1>
          <hex2>9f</hex2>
          <string>&#63647;</string>
          <description></description>
        </imode>
        <ezweb>
          <A>44</A>
          <B>44</B>
          <C>44</C>
          <D>44</D>
        </ezweb>
        <jphone>
          <string>$Gj</string>
        </jphone>
      </set>

絵文字の定義は、<emoji>タグから</emoji>タグまでの間にあります。その中の要素を説明します。1つの絵文字につき、1つのセット（<set>タグから</set>タグまで）とし、キャリア毎の絵文字を定義しています。

1. <imode>要素
   まず、元となるi-Mode用の絵文字は、<imode>タグにはさまれた間に定義されています。<imode>要素は、2バイトコード要素(<hex1><hex2>)と、10進参照文字列要素(<string>)を保持していて、この２つの要素を変換元の値として使用します。アクセスしてきた端末が、i-Mode機であった場合で、かつCHTML中に10進参照文字列が絵文字として書かれている場合には、<hex1><hex2>要素に定義されている値に置換します。
2. <ezweb>要素
   アクセスしてきた端末が、au機であった場合、<ezweb>要素に定義されている値に変換します。<ezweb>要素は、<A>〜<D>要素を持っていて、それぞれauの絵文字タイプA〜Dに対応していますので、もし、Dタイプの絵文字端末であったなら、<D>要素に定義されている値に変換します。ここで定義されている値は、HDML機の場合は、<IMG ICON="XX">の"XX"の部分に当てはめられて、置換されます。XHTML機の場合は、<IMG LOCALSRC="XX">の"XX"の部分に当てはめられて、置換されます。
3. <jphone>要素
   アクセスしてきた端末が、SoftBank/Vodafone/J-Phone端末であった場合、<jphone>要素に定義されている値に変換します。<jphone>要素は、<string>要素を保持していて、ここで定義されている値を直接使用します。

emoji.xmlに定義されていない絵文字で、変換したい絵文字がある場合には、このファイルに新たな定義を足せば、変換するようになります。

## デバイス定義 device_data.xml

mod_chxjの動作を決定付ける重要な定義です。変換対象の端末は全て、device_data.xmlファイルに定義される必要があります。定義されていない端末は、mod_chxjとしては、認識することができません。認識できない場合には、変換せずにそのまま出力します。ただし、Perl互換の正規表現によって定義できるため、正規表現の書き方によっては全ての機種に対応させることも可能です。

## イメージ画像変換機能

mod_chxjには、JPEG、GIF、PNG、BMPファイルを置いておくだけで、デバイス定義に従って、それぞれのキャリア対応のフォーマットに変換する機能があります。画像のサイズ（縦Ｘ横）も、端末の画面サイズに合わせて変換します。画像のサイズ（バイト数）については、デバイス定義中のキャッシュサイズを見て、その値よりも小さくなるように努力しますが、元の画像が大きすぎる場合や、複雑な画像の場合には、キャッシュサイズよりも小さくできずに表示できない場合があります。
それぞれのタグで指定する場合には、ファイル名の拡張子（.jpgや.gif等）をはずした形で指定します。
本機能には３つのモードが存在します。そのモードを以下に記します。

### サムネイルモード

端末側画面サイズの約３分の１程度のサイズ（縦Ｘ横）に画像を縮小表示します。

サムネイルモード 使用例

      <IMG SRC="/img/logo?Mode=Thumbnail">

### 壁紙モード

端末側画面のサイズにマッチするサイズに拡大・縮小します。横長の画像の場合には、縦幅を合わせた後に左右をトリミングします。

壁紙モード 使用例

      <IMG SRC="/img/logo?Mode=WP">

### EzGetモード

壁紙ダウンロードを行いたい場合に使用します。EzGETモードは、壁紙モードで出力される画像サイズと同一サイズの画像が使用されます。

EzGetモード 使用例

      <A HREF="/img/logo?Mode=EzGet">

### その他の機能

モードの他に、画像サイズ（縦Ｘ横）を直接指定することも可能です。wパラメータ、hパラメータを使用して指定します。

1. wパラメータ
   横幅を指定します。
2. hパラメータ
   縦幅を指定します。
   w/hパラメータ 使用例

         <IMG SRC="/img/logo?w=100&h=200">

3. User-Agentパラメータ（uaパラメータ）
   User-Agentを指定します。指定した場合は、リクエストヘッダ中のUser-Agentを本パラメータの値で上書きします。このパラメータに"IGN"を指定した場合は、User-Agentを無視します。Thumbnailモード、壁紙モードと併用時は、640x480を元に画像サイズを算出します。

上記全てのモード、パラメータはGETリクエストとしてのみ使用できます。

## QRコード出力機能

### QRコード出力ハンドラの登録

QRコード出力機能を使用するには、QRコードハンドラを登録します。(7)httpd.confに以下の記述を追加します。

httpd.conf

      AddHandler chxj-qrcode .qrc

なお、ハンドラを登録しないでも、出力フィルターを経由させることで、QRコードを出力させることも可能です。（※QRコードの動的出力を参照）

1. QRコードは（株）デンソーウェーブの登録商標です。

### QRコードソースファイルの設置

ハンドラを登録したら、その登録した拡張子を持つファイルを用意します。

例：a.qrc

      <?xml version=1.0 ?>

      <qrcode>
        <version>13</version>
        <level>H</level>
        <mode>8bit</mode>
        <size>1</size>
        <data>テストデータです</data>
      </qrcode>

.qrcファイルは、qrcode要素、version要素、level要素、mode要素、size要素、data要素から成り立ちます。

1. versionタグversionタグは出力するQRコードの生成に利用するバージョンを指定します。使用できるバージョンは、1〜40までの40種類です。
2. levelタグlevelタグは出力するQRコードの生成に利用する誤り検出レベルを指定します。　使用できるレベルは、L、Q、M、Hの４つです。
3. modeタグmodeタグは出力するQRコードの生成に利用するモードを指定します。使用できるモードは、NUM（数字モード）ALPHA（英数字モード）8BIT（8ビットバイトモード）KANJI（漢字モード）です。
4. sizeタグsizeタグは１モジュールを何ピクセルであらわすかを指定します。0を指定した場合は、4を指定した場合と同じ動作をします。　使用できるサイズは、0〜20までです。
5. dataタグdataタグは、QRコードに出力するデータを指定します。改行した場合は、改行文字もQRコード内に符号化されます。

### QRコードの動的出力機能

プログラム等を使用し、動的にQRコードを出力したい場合は、上記の.qrcファイルの内容をそのままOutputFilterに通してあげればOKです。つまり、ChxjConvertRuleディレクティブで"EngineOn"と指定したURIが指すディレクトリに設置すれば良いということです。mod_chxj内部で、Content-Typeがtext/xmlの場合、QRCode用のファイルであるかどうかを一度読み込んで判断するので、Content-Typeには、text/xmlを設定してください。

phpでQRコードを動的に出力する例

        <php
          $version = $_POST["version"];
          $level   = $_POST["level"];
          $mode    = $_POST["mode"];
          $size    = $_POST["size"];
          $data    = $_POST["data"];

          header("Content-Type: text/xml; charset=Shift_JIS");

          echo "<qrcode>\n";
          echo "<version>".$version."</version>\n";
          echo "<level>".$level."</level>\n";
          echo "<mode>".$mode."</mode>\n";
          echo "<size>".$size."</size>\n";
          echo "<data>".$data."</data>\n";
          echo "</qrcode>\n";
        >

そして、上記のコードを、mod_chxj変換エンジンが処理するはずであるところに設置すれば完了です。

## Cookieシミュレート機能

Cookieを受け付けない（無視する）端末のためにCookieをシミュレートします。本機能を有効にするためにはChxjConvertRuleディレクティブを使用する必要があります。ChxjConvertRuleディレクティブの第２パラメータにCookieOnを指定します。

Cookieシミュレート機能を有効にする例

        ChxjConvertRule "^/chxj.+$" "EngineOn,CookieOn" "NONE"

### One-Time ID

Cookieシミュレートでは、aタグ、imgタグ、formタグのURL部にOne-Time IDを埋め込むことで実現します。そのため、ユーザがブラウザの戻るボタン等で戻った場合はCookieを取得できなくなります。One-Time IDを使用する必要が無い場合、またはOne-Time IDを使用したくない場合には、CookieLazyModeを使用することで毎回同一IDを発行させることができます。

### Cookieの保存場所

Cookieの内容はサーバ側に保存されます。保存先にはdbm、memcached、mysqlが選択できます。
注意) memcached、mysqlを保存先に選択する場合はconfigure時にそれぞれ指定する必要があります
保存先の指定にはChxjCookieStoreTypeディレクティブを使用します。

ChxjCookieStoreTypeでDBMを指定した例

        ChxjCookieStoreType "dbm"

ChxjCookieStoreTypeでMySQLを指定した例

        ChxjCookieStoreType "mysql"

ChxjCookieStoreTypeでmemcacheを指定した例

        ChxjCookieStoreType "memcache"

上記ChxjCookieStoreTypeが指定されない場合はdbmが選択されます。

dbmを使用する場合は、ChxjCookieDirディレクティブを指定し、保存ディレクトリを指定します。指定しなかった場合は/tmpに保存されます。

ChxjCookieDirの例

        ChxjCookieDir /var/abc

DBMの代わりにMySQLやmemcachedを指定することもできます。その際は、ChxjCookieDirは指定する必要はありません。MySQLを使用するには、configure時にMySQL COOKIE機能を有効にして、コンパイルする必要があります。(8)memcachedを使用するには、configure時にMEMCACHE COOKIE機能を有効にして、コンパイルする必要があります。(9)

MySQLを使用する場合にはChxjCookieStoreTypeディレクティブのほかに、以下のディレクティブを指定する必要もあります。

1. ChxjCookieMysqlHost
   MySQLサーバの動作するホストを指定します。
   ChxjCookieMysqlHostの例

                ChxjCookieMysqlHost "localhost"

2. ChxjCookieMysqlPort
   MySQLサーバのポート番号を指定します。
   ChxjCookieMysqlPortの例

                ChxjCookieMysqlPort 3306

3. ChxjCookieMysqlDatabase
   MySQLサーバのデータベース名を指定します。
   ChxjCookieMysqlDatabaseの例

                ChxjCookieMysqlDatabase "test_db"

4. ChxjCookieMysqlUsername
   MySQLサーバに接続する際に使用するユーザ名を指定します。
   ChxjCookieMysqlUsernameの例

                ChxjCookieMysqlUsername "roottest"

5. ChxjCookieMysqlPassword
   MySQLサーバに接続する際に使用するパスワードを指定します。
   ChxjCookieMysqlPasswordの例

                ChxjCookieMysqlPassword "pwtest"

6. ChxjCookieMysqlSocketPath
   MySQLのソケットパスを指定します。
   ChxjCookieMysqlSocketPathの例

                ChxjCookieMysqlSocketPath  "/tmp/mysql.sock"

7. ChxjCookieMysqlCharset
   MySQLのエンコードを指定します。
   ChxjCookieMysqlCharsetの例

                ChxjCookieMysqlCharset  "utf8"

8. ChxjCookieMysqlTablename
   MySQLのクッキーを保存するテーブル名を指定します。

   ChxjCookieMysqlTablenameの例

                ChxjCookieMysqlTablename  "chxj_cookie"

   上記のように"chxj_cookie"と指定すると、実際に作成されるテーブルは、chxj_cookieとchxj_cookie_expireテーブルの2つになります。

memcachedを使用する場合にはChxjCookieStoreTypeディレクティブの他に以下のディレクティブを指定する必要もあります。

1. ChxjCookieMemcacheHost
   memcachedの動作するホストを指定します。
   ChxjCookieMemcacheHostの例

                ChxjCookieMemcacheHost "localhost"

2. ChxjCookieMemcachePort
   memcachedのポート番号を指定します。
   ChxjCookieMemcachePortの例

                ChxjCookieMemcachePort 11211

1. Buildの項参照
2. Buildの項参照

### Cookieの保持期間

ChxjCookieTimeoutディレクティブで保持期間を指定することができます。指定しなかった場合は1800秒でサーバに保存されているCookieは削除されます。

ChxjCookieTimeoutの例

        <Location />
          ChxjCookieTimeout 10
        </Location>

上記の例は、10秒でタイムアウト(サーバから削除)するように指定しています。

### CookieLazyMode

ChxjCookieLazyModeディレクティブで"true"を指定するとOne-Time IDを使用しないようにすることができます。Cookie用のIDは毎回同一のIDが割り振られます。以下にCookieLazyModeの例を記します。

ChxjCookieLazyModeの例

      ChxjCookieLazyMode true

true以外を指定すると通常のOne-Time IDモードになります。

## Refererシミュレート機能

DoCoMo端末などのRefererに対応していない機種のためにRefererシミュレート機能を提供します。本機能は、Cookieシミュレート機能を有効にすると、自動で有効になります。