mod_chxj Atsushi Konno 29 Mar 2005 Last modified: Sat, 23 Mar 2008 03:21:16 +0900
mod_chxjはオープンソースの携帯向けコンテンツ変換Apache2.x用モジュールであり、 CHTML(DoCoMo i-Mode用 CHTML3.0)で記述された文書や通常のHTMLで記述された文書を、アクセスに来た端末のUser-Agentヘッダを見て、それぞれの端末にあった形式に変換します。 HTML文書に限らず、画像(jpg、gif、png)、絵文字についても、定義ファイルに従ってそれぞれのキャリアにあった絵文字に変換します。 Cookie非対応端末、Refer非対応端末のために、Set-Cookie、CookieヘッダやRefererヘッダをシミュレートすることもできます(EXPERIMENTAL)。
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. Linux
mod_chxjはこちらからダウンロードすることができます。 以下にmod_chxjインストール手順を示します。
  1. Configure スクリプトを生成します(必須ではない) $ ./buildconf.sh "$"はプロンプトをあらわします。
  2. Configure $ ./configure 場合によっては--with-apr-configや--with-apu-configも必要です。 0.8.6以下の場合には--with-apache-headerが必須です 詳細はBuildを参照
  3. mod_chxj.soを生成します $ make
  4. apacheにインストールします $ make install
  5. データの設置 etcディレクトリは以下のdevice_data.xmlとemoji.xmlをApache からアクセスできるところに配置します。 0.9.0からemoji.xml、device_data.xmlの定義フォーマットを変更しましたのでバージョンをあわせてください 以下、/etc/apache2/chxjディレクトリにchxj用設定ファイルを用意する場合 $ mkdir -p /etc/apache2/chxj $ cp etc/device_data.xml /etc/apache2/chxj $ cp etc/emoji.xml /etc/apache2/chxj
mod_chxjをコンパイルするにはconfigureを行う必要があります。 以下にconfigureのオプションを記します。 通常指定する必要はありません。configureでApacheのヘッダファイルの場所が検知できなかった場合や、任意のApacheヘッダファイルを使用したい場合に指定します。 $ ./configure --with-apache-header=/usr/include/apache2 上記は/usr/include/apache2以下にApacheのヘッダファイルがある場合の例です。 通常指定する必要はありません。configureでapxsを検知できなかった場合や、任意のapxsプログラムを指定したい場合に指定します。 $ ./configure --with-apxs=/usr/local/apache2/bin/apxs2 上記は/usr/local/apache2/bin/apxs2を使用するようにapxsに指定しています。 通常指定する必要はありません。 configureでapr-configを検知できなかった場合や、任意のapr-configプログラムを指定したい場合に指定します。 $ ./configure --with-apr-config=/usr/local/apache2/bin/apr-1-config 上記は/usr/local/apache2/bin/apr-1-configを使用するように指定しています。 通常指定する必要はありません。 configureでapu-configを検知できなかった場合や、任意のapu-configプログラムを指定したい場合に指定します。 $ ./configure --with-apu-config=/usr/local/apache2/bin/apu-1-config 上記は/usr/local/apache2/bin/apu-1-configを使用するように指定しています。 Cookieシミュレート機能を使用する際、保存先をデフォルトのDBMでは無く、MySQLに保存するようにします。 DefaultのDBMで良い場合や、Cookieシミュレート機能を使用しない場合は指定する必要はありません。 別途MySQLサーバを用意する必要があります。また、本オプションを指定した場合は、--with-mysql-header、--with-mysql-lib-dirも指定します。 これはMySQLのヘッダとライブラリが必要なことを意味します。使用するMySQLのライブラリは今のところlibmysqlclient_r.soのみです。 注意) --enable-memcache-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がある場合の例です。 --enable-mysql-cookieを指定した場合は必須です。 MySQLのヘッダファイルの場所を指定します。 $ ./configure --enable-mysql-cookie --with-mysql-header=/usr/include/mysql --with-mysql-lib-dir=/usr/lib --enable-mysql-cookieを指定した場合は必須です。 MySQLのライブラリ、libmysqlclient_r.soの設置されているディレクトリを指定します。 $ ./configure --enable-mysql-cookie --with-mysql-header=/usr/include/mysql --with-mysql-lib-dir=/usr/lib Cookieシミュレート機能を使用する際、保存先をデフォルトのDBMでは無く、memcachedに保存するようにします。 DefaultのDBMで良い場合や、Cookieシミュレート機能を使用しない場合は指定する必要はありません。 別途memcachedを用意する必要があります。また、本オプションを指定した場合は、--with-apr-memcache-header、--with-apr-memcache-lib-dirも指定します。 これはapr_memcacheのヘッダとライブラリが必要なことを意味します。 注意) --enable-mysql-cookieとの併用はできません。 $ ./configure --enable-memcache-cookie --with-apr-memcache-header=/usr/include/apr-memcache0 --with-apr-memcache-lib-dir=/usr/lib 上記は、/usr/include/apr_memcache0以下にapr-memcache用のヘッダがあり、/usr/lib以下にlibapr_memcache.soがある場合の例です。 --enable-memcache-cookieを指定した場合は必須です。 apr-memcacheのヘッダファイルの場所を指定します。 $ ./configure --enable-memcache-cookie --with-apr-memcache-header=/usr/include/apr_memcache0 --with-apr-memcache-lib-dir=/usr/lib --enable-mysql-cookieを指定した場合は必須です。 apr-memcacheのライブラリ、libapr_memcache.soの設置されているディレクトリを指定します。 $ ./configure --enable-memcache-cookie --with-apr-memcache-header=/usr/include/apr_memcache0 --with-apr-memcache-lib-dir=/usr/lib
以下はmod_chxjが/usr/lib/apache2/modulesディレクトリ配下に設置されたものとしています 例として、Locationが"/chxj"以下のものは全て変換する場合を説明します。
  1. httpd.confに以下を追加します。 #==================================================================================== # モジュールをApache2.0にロード #==================================================================================== 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の再起動。
  1. 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の再起動。
  1. 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に指示しています。 <Location /img> ChxjImageEngine On ChxjImageCacheDir /tmp ChxjImageCopyright "A.Konno" ChxjImageCacheLimit 10485760 </Location> 上記の説明を以下に示します。
    1. ChxjImageEngine
      mod_chxjの画像変換ハンドラを起動するよう指示しています。 DefaultはOff

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

    3. ChxjImageCopyright
      mod_chxjの画像変換ハンドラに、転送禁止設定を行うよう指示します。 パラメータとして任意の文字列をとります。 ChxjImageCopyrightディレクティブで指定された文字列は、それぞれのイメージの コメント部に埋め込まれます。 ChxjImageCopyright "A.Konno" mod_chxjに転送禁止設定を行うよう指示しています。 変換後イメージのコメント部分には、キャリア毎に以下の文字列を埋め込みます。 AU の場合 kddi_copyright=on,A.Konno DoCoMoの場合 copy="NO",A.Konno SoftBank/Vodafoneの場合は、レスポンスヘッダに x-jphone-copyright:no-transfer を埋め込みます。 SoftBank/Vodafoneの場合は、リクエストURLの最後が.pnzか、.jpzで終わるようにダミーを付けなければなりません。
    4. ChxjImageCacheLimit
      mod_chxj画像変換ハンドラが使用する変換後の画像をおいておくディレクトリの許容量を指定します。 単位はbyte。 ChxjImageCacheLimit 1024 mod_chxjに画像変換キャッシュ最大サイズとして1kbyteと指定。 ※このとき変換結果が1kbyte以上あるような場合にはINTERNAL_SERVER_ERRORを返します。 十分な領域を確保するか、画像サイズを小さくしてください。

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


  1. ChxjLoadDeviceData
    デバイス定義ファイルを指定します。 ChxjLoadDeviceData /etc/apache2/device.xml
  2. ChxjLoadEmojiData
    絵文字変換定義ファイルを指定します。 ChxjLoadEmojiData /etc/apache2/chxj/emoji.xml
  3. ChxjImageEngine
    画像変換エンジンを有効にします。 パラメータとしてOnとOffを指定できます。 DefaultはOffです。 ChxjImageEngine On
  4. ChxjImageCacheDir
    イメージの一時ファイル保存場所を指定します。 ChxjImageCacheDir /tmp
  5. ChxjImageCacheLimit
    イメージの一時ファイル保存許容量を指定します。 下記は1MByteの例。 ChxjImageCacheLimit 1048576
  6. ChxjImageCopyright
    イメージに著作権情報を付与します。 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出力時には評価されません。
    ChxjConvertRule "^/chxj.+$/" EngineOn EUC-JP
  8. ChxjCookieDir
    クッキーを使用する場合に指定します。クッキーの内容を保存するディレクトリを指定します。 指定しない場合は/tmpに保存されます。 <Location /> ChxjCookieDir /tmp </Location> 詳細は「Cookieシミュレート機能」の項を参照ください。
  9. ChxjCookieTimeout
    クッキーを使用する場合に指定します。クッキーの保持期間を秒単位で指定します。 指定しない場合は、1800秒でクッキーデータを破棄します。 <Location /> ChxjCookieTimeout 10 </Location> 詳細は「Cookieシミュレート機能」の項を参照ください。
変換可能なCHTMLタグは以下のとおりです。 上記以外のタグは全て無視されます。
タグ 属性 CHTML HDML XHTML JHTML 備考
<HTML> 属性を指定した場合は無視します
<META> http-equiv × CHTML1.0、HDMLでは無視します
content × CHTML1.0、HDMLでは無視します
<HEAD> 属性を指定した場合は無視します
<TITLE> 属性を指定した場合は無視します
<BASE> × HDMLでは無視します
<BODY> bgcolor × HDML、CHTML1.0、CHTML2.0では無視します
text × HDML、CHTML1.0、CHTML2.0では無視します
link × HDML、CHTML1.0、CHTML2.0では無視します
<A> href
accesskey
<BR>
<FONT> color × HDML,CHTML1.0では無視します
<FORM> action
method × HDMLでは無視します
<INPUT> name SoftBankの予約クエリ名は内部で変換するので指定しても良い
type text,password,hidden,radio,checkbox,submitに対応
value
istyle
<SELECT> name
size × HDMLでは無視します
<OPTION> value 必ず閉じてください。そのうち対応します。
checked
<DIV> align
<HR>
<CENTER>
<IMG> src
<DL>   ×
<DT>   必ず閉じてください。そのうち対応します。
<DD>   必ず閉じてください。そのうち対応します。
<CHXJ:IF> lang lang="chtml" lang="xhtml" lang="hdml" lang="jhtml"が指定できます
  1. <CHXJ:IF>
    <CHXJ:IF>タグと</CHXJ:IF>タグではさまれたタグやテキストは、 変換せずにそのまま変換しませんので注意が必要です出力します。必須の属性としてlangがあります。lang属性を指定することによって、 例えば、「HDML機の場合のみ出力させる」といったことを可能にします。

    ex) <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) <CHXJ:IF lang="chtml" > シークレットコードがどーのこーの。 </CHXJ:IF>
    また、lang属性は、複数指定することも可能です。
    <CHXJ:IF lang="chtml" lang="jhtml"> あなたの携帯は、HDML機かJ-HTML機です。 </CHXJ:IF>
サーバサイドコンテンツについてはShift_JIS(CP932)、EUCJP-WIN(Win外字対応のEUCJP)、UTF-8のどれかで記述することが可能です。 Shift_JISで記述した場合は絵文字についてもShift_JISで、EUCJP-WINで記述した場合は絵文字についてもEUCJP-WINで、UTF-8で記述した場合は絵文字についてもUTF-8で 記述します。詳細は「絵文字について」の項を参照のこと クライアントサイド(端末側)に送信する文字コードはShift_JISまたはUTF-8を指定することが可能です。指定方法については「デバイス定義」の項を参照のこと。 mod_chxjによりサーバサイドコンテンツの文字コードから端末に送信する文字コードへと絵文字も含めて変換します。 POST/GET中のデータについても端末側文字コードからサーバサイドコンテンツの文字コードへと絵文字も含めて変換します。
  1. 注意: Shift_JISでサーバサイドコンテンツを記述した場合はPOST/GETデータもShift_JISでサーバサイドコンテンツに渡されます。
  2. 注意: EUCJP-WINでサーバサイドコンテンツを記述した場合はPOST/GETデータもEUCJP-WINでサーバサイドコンテンツに渡されます。
  3. 注意: UTF-8でサーバサイドコンテンツを記述した場合はPOST/GETデータもUTF-8でサーバサイドコンテンツに渡されます。
  4. 注意: 本変換機能は1.0.0以降から
サーバサイドコンテンツの文字コードはChxjConvRuleディレクティブで指定した文字コードになります。 ChxjConvRuleにて矛盾が生じない限り、文字コードの混在も可能です。
i-Mode用の絵文字を書いておけば、アクセスしたキャリアによって、mod_chxjが対応の絵文字に自動変換します。 ソースに2byteのバイナリコードを直接書いても、10進参照文字列(&#XXX;の形)、16進参照文字列(&#xXXX;の形)で書いても、変換対象になります。 10進参照文字列、16進参照文字列はmod_chxjにより自動で2バイトコードに変換されます。 コンテンツをSJISで記述する場合には絵文字もSJISで、コンテンツをEUCJP-WINで記述する場合には絵文字もEUCJP-WINで、UTF-8で記述する場合には絵文字もUTF-8で記述する必要があります 絵文字の変換に関する動作を変えたい場合(例えば「ハートがあったら、AUの場合はスペードに」とか、「変換定義がおかしい」といった場合)は、 emoji.xmlファイルを直接編集することによって定義を変更することが可能です。emoji.xmlはXMLファイルとなっていますので、人によってはvi等で簡単に定義を 変更することができるかもしれません。 emoji.xmlは3つのパートに分かれています。1つ目はDoCoMo→DoCoMo/au/SoftBankの変換定義部。 2つ目はau→DoCoMoの変換定義部。3つ目はSoftBank→DoCoMoの変換定義部。 1つ目はサーバサイドコンテンから各キャリアの絵文字に変換する際に使用されます。 2つ目と3つ目はPOST/GETデータの変換に使用されます。
以下に、emoji.xmlファイルの1つ目のパート、DoCoMo→DoCoMo/au/SoftBankの変換定義部を記します。 <emoji> <set> <no>1</no> <imode> <sjis-hex>f89f</sjis-hex> <sjis-dec>63647</sjis-dec> <eucjp-hex>8ffca1</eucjp-hex> <eucjp-dec>9436321</eucjp-dec> <unicode-hex>e63e</unicode-hex> <unicode-dec>58942</unicode-dec> <utf8-hex>ee98be</utf8-hex> <utf8-dec>15636670</utf-dec> <description>晴れ</description> </imode> <ezweb> <A> <no>44</no> <sjis-hex>f660</sjis-hex> <sjis-dec>63072</sjis-dec> <unicode-hex>e488</unicode-hex> <unicode-dec>58504</unicode-dec> <utf8-hex>eebda0</utf8-hex> <utf8-dec>15646112</utf-dec> </A> <B> <no>44</no> <sjis-hex>f660</sjis-hex> <sjis-dec>63072</sjis-dec> <unicode-hex>e488</unicode-hex> <unicode-dec>58504</unicode-dec> <utf8-hex>eebda0</utf8-hex> <utf8-dec>15646112</utf-dec> </B> <C> <no>44</no> <sjis-hex>f660</sjis-hex> <sjis-dec>63072</sjis-dec> <unicode-hex>e488</unicode-hex> <unicode-dec>58504</unicode-dec> <utf8-hex>eebda0</utf8-hex> <utf8-dec>15646112</utf-dec> </C> <D> <no>44</no> <sjis-hex>f660</sjis-hex> <sjis-dec>63072</sjis-dec> <unicode-hex>e488</unicode-hex> <unicode-dec>58504</unicode-dec> <utf8-hex>eebda0</utf8-hex> <utf8-dec>15646112</utf-dec> </D> </ezweb> <softbank> <no>74</no> <sjis-hex>476a</sjis-hex> <sjis-dec>116572776975</sjis-dec> <unicode-hex>e04a</unicode-hex> <unicode-dec>57418</unicode-dec> <utf8-hex>ee818a</utf8-hex> <utf8-dec>15630730</utf-dec> </softbank> </set> ・ ・ ・ ・ </emoji> 絵文字の定義は、<emoji>タグから</emoji>タグまでの間にあります。その中の要素を説明します。 1つの絵文字につき、1つのセット(<set>タグから</set>タグまで)とし、キャリア毎の絵文字を定義しています。 合計176セットあります。
  1. <imode>要素
    まず、元となるi-Mode用の絵文字は、<imode>タグにはさまれた間に定義されています。 <imode>要素は子にsjis、eucjp、utf8、unicodeのそれぞれ16進と10進表記データを保持します。 sjis-hexはShift_JISコードの16進表記、sjis-decはShift_JISコードの10進表記、eucjp-hexはEUCJP-WINの16進表記、eucjp-decはEUCJP-WINの10進表記、utf8-hexはUTF-8の16進表記、utf8-decはUTF-8の10進表記、unicode-hexはUNICODEの16進表記、unicode-decはUNICODEの10進表記となります。 サーバサイドコンテンツがSJISで記述されている場合はimode要素のsjis-hex、sjis-decを参照します。 同様にがEUCJP-WINで記述されている場合はimode要素のeucjp-hex、eucjp-decを参照します。 UTF-8で記述されている場合はimode要素のutf8-hex、utf8-decを参照します。
    サーバサイドコンテンツのマッチするコードがimode要素の中に存在すれば、変換は同一set内のデータを使用して行われます。


  2. <ezweb>要素
    アクセスしてきた端末が、AU機であった場合、<ezweb>要素に定義されている値に変換します。 <ezweb>要素は、<A>〜<D>要素を持っていて、それぞれAUの絵文字タイプA〜Dに対応していますので、 もし、Dタイプの絵文字端末であったなら、<D>要素の<no>に定義されている値に変換します。ここで定義されている値は、 HDML機の場合は、<IMG ICON="XX">の"XX"の部分に当てはめられて、置換されます。 XHTML機の場合は、<IMG LOCALSRC="XX">の"XX"の部分に当てはめられて、置換されます。 同要素にはsjis-hex、sjis-dec、unicode-hex、unicode-dec、utf8-hex、utf8-decが有りますが、今のところ使用していません。


  3. <softbank>要素
    アクセスしてきた端末が、SoftBank/Vodafone/J-Phone端末であった場合、<softbank>要素に定義されている値に変換します。 <softbank>要素は、上記要素と同様にsjis-hex、sjis-dec、unicode-hex、unicode-dec、utf8-hex、utf8-decを保持しています。 アクセスしてきた端末にはsjisを返す場合はsjis-hex、sjis-decの値を使用します。utf8を返す場合にはutf8-hex、utf8-decでは無くunicode-hex、unicode-decを返します。 SoftBank端末の場合は3G端末は基本的にUTF8を返すようにデバイス定義にて定義されています。UTF8で定義された場合でSoftBankの場合はUNICODEの参照文字列を返すように なっています。(問題回避のため)

emoji.xmlに定義されていない絵文字で、変換したい絵文字がある場合には、このファイルに新たな定義を足せば、 変換するようになります。同一コード領域に割り当てる必要があるかもしれません
au->DoCoMo変換の定義は主にau端末からサーバサイドへのPOST/GETデータの変換に使用されます。 定義はemoji.xmlファイルの<ezweb2imode>タグではさまれたところに定義してあります。 <set>から</set>までの間が1絵文字を表現する部分になります。
以下に、emoji.xmlファイルの2つ目のパート、au→DoCoMo変換定義を以下に記します。 <ezweb2imode> <set> <no>1</no> <ezweb> <sjis-hex>F659</sjis-hex> <utf8-hex>eebd99</utf8-hex> </ezweb> <imode> <no>220</no> </imode> </set> ・ ・ ・ </ezweb2imode>
  1. <no>要素
    auで定義されている絵文字番号を保持します。


  2. <ezweb>要素
    <no>で定義された絵文字番号の実際にPOST/GETされてくる値を保持します。sjis-hexは端末がShift_JISの場合のPOST/GETデータ、utf8-hexは端末がUTF-8の場合のPOST/GETデータになっています。 POST/GETされたデータはこの要素に記述されたコードとマッチングされ、マッチした場合絵文字を特定します。


  3. <imode>要素
    <ezweb>要素でマッチした場合に参照されるEzWeb絵文字に対応するDoCoMo絵文字番号を保持します。mod_chxjによりDoCoMo絵文字に変換する場合に使用されます。


SoftBank->DoCoMo変換の定義は主にSoftBank端末からサーバサイドへのPOST/GETデータの変換に使用されます。 定義はemoji.xmlファイルの<softbank2imode>タグではさまれたところに定義してあります。 <set>から</set>までの間が1絵文字を表現する部分になります。
以下に、emoji.xmlファイルの3つ目のパート、SoftBank→DoCoMo変換定義を以下に記します。 <softbank2imode> <set> <no> 1 </no> <softbank> <webcode> 4721 </webcode> <sjis-hex> f941 </sjis-hex> <utf8-hex> ee8081 </utf8-hex> </softbank> <imode> <no> 140 </no> </imode> </set> ・ ・ ・ ・ </softbank2imode>
  1. <no>要素
    SoftBankで定義されている絵文字番号を保持します。


  2. <softbank>要素
    <no>で定義された絵文字番号の実際にPOST/GETされてくる値を保持します。webcodeは端末がShift_JISの場合でウェブコードを送信してくる場合のPOST/GETデータ、sjis-hexは端末がShift_JISの場合のPOST/GETデータ、utf8-hexは端末がUTF-8の場合のPOST/GETデータになっています。 POST/GETされたデータはこの要素に記述されたコードとマッチングされ、マッチした場合絵文字を特定します。


  3. <imode>要素
    <ezweb>要素でマッチした場合に参照されるSoftBank絵文字に対応するDoCoMo絵文字番号を保持します。mod_chxjによりDoCoMo絵文字に変換する場合に使用されます。




mod_chxjの動作を決定付ける重要な定義です。変換対象の端末は全て、device_data.xmlファイルに定義される必要があります。 定義されていない端末は、mod_chxjとしては、認識することができません。認識できない場合には、変換せずにそのまま出力します。ただし、Perl互換の正規表現によって定義できるため、正規表現の書き方によっては全ての機種に対応させることも可能です。
まず以下にデバイス定義を記します。 <devices> <user_agent pattern="^KDDI-([^ ]+) UP.Browser/[^ ]+ .+"> <device> <device_id>HI21</device_id> <device_name>C3001H</device_name> <html_spec_type>XHTML_MOBILE_1_0</html_spec_type> <width>120</width> <heigh>130</heigh> <gif>true</gif> <jpeg>true</jpeg> <png>true</png> <bmp2>false</bmp2> <bmp4>false</bmp4> <color>4096</color> <emoji_type>C</emoji_type> <wp_width>120</wp_width> <wp_heigh>116</wp_heigh> <cache>9740</cache> <dpi_width>72</dpi_width> <dpi_heigh>72</dpi_heigh> <charset>SJIS</charset> </device> ・ ・ ・ </user_agent> <user_agent> ・ ・ ・ </user_agent> ・ ・ ・ </devices> デバイス定義は<devices>タグに囲まれた中に記述します。 devicesタグはuser_agentタグを子に持ちます。user_agentはpattern属性を保持し、端末のUser-Agentヘッダとマッチングされます。user_agentタグのpattern属性とマッチした場合には、そのuser_agentタグの子ノードであるdevice要素を1つづつ見に行きます。user_agentタグのpattern属性は正規表現となっていて、$1がデバイス識別IDになるように定義されていますので、$1とdevice_idタグの要素をマッチングします。マッチしたdeviceを該当端末とし、mod_chxjは該当端末用の変換処理を行います。
以下に各タグについての説明を記します。
  1. devicesタグ
    全ての要素は一組のdevicesタグに囲まれます。この中に存在する要素がデバイス定義になります。

  2. user_agentタグ
    User-Agentのパターンとそのパターンにマッチするdeviceを子ノードに持ちます。
    pattern属性にはUser-AgentとマッチさせるPerl互換の正規表現を指定します
    仮に"KDDI-CA31 UP.Browser/・・・"というUser-Agentを保持する端末からのアクセスがあった場合は、 <user_agent pattern="^KDDI-([^ ]+) UP.Browser/[^ ]+ .+">にマッチしますが、<user_agent pattern="^UP.Browser/[^\-]+-([^ ]+) .+" > にはマッチしません。 よってmod_chxjは<user_agent pattern="^KDDI-([^ ]+) UP.Browser/[^ ]+ .+">の子ノードを処理対象と判断します。
    pattern属性の要素である正規表現には必ず$1で後方参照できるようグルーピングが必要です。$1で後方参照する値は以下に記すdevice_idタグの値と比較されます。 device_idとの比較の結果、等しい値であればそのdevice_idを保持するdeviceタグが該当端末として選択されます。
    user_agentタグレベルではマッチしているもののdevice_idが期待する値を持っていない場合は、user_agentタグ中の最後のdeviceが選択されます。

  3. deviceタグ
    一台の端末を表現します。
    子ノードとして以下を保持します。
    1. device_id
    2. device_name
    3. html_spec_type
    4. width
    5. height
    6. gif
    7. jpeg
    8. png
    9. bmp2
    10. bmp4
    11. color
    12. emoji_type
    13. wp_width
    14. wp_height
    15. cache
    16. dpi_width
    17. dpi_height
    18. charset


  4. device_idタグ
    user_agentタグのpattern属性により生成された$1により後方参照される値と比較される値を保持します。通常DoCoMoであればUser-Agentの「機種名」部、 auであればUser-Agentの「デバイスID」部、 SoftBankであれば、User-Agentの「機種名」部を記述します。 <!-- DoCoMo F905iの場合 --> <device_id>F905i</device_id> <!-- au W54Tの場合 --> <device_id>TS3E</device_id> <!-- SoftBank 822SHの場合 --> <device_id>822SH</device_id>
  5. device_nameタグ
    mod_chxjでは本値をデバッグログ出力時にのみ使用します、人が見てわかりやすい名前を入力しておきます。 device_idと混同しないように注意します。 <device_name>W21CA</device_name>
  6. html_spec_typeタグ
    端末のサポートするHTMLタイプを指定します。本タグの値によりHTML変換結果が変わります。 指定できる値は以下のとおりです。大文字、小文字は区別しません。
    意味
    CHTML_1_0 CHTML1.0対応機種の場合記述します。HTML変換結果はCHTML1.0になります。
    CHTML_2_0 CHTML2.0対応機種の場合記述します。HTML変換結果はCHTML2.0になります。
    CHTML_3_0 CHTML3.0対応機種の場合記述します。HTML変換結果はCHTML3.0になります。
    CHTML_4_0 CHTML4.0対応機種の場合記述します。HTML変換結果はCHTML4.0になります。(0.9.0時点ではCHTML3.0と同じ)
    CHTML_5_0 CHTML5.0対応機種の場合記述します。HTML変換結果はCHTML5.0になります。(0.9.0時点ではCHTML3.0と同じ)
    CHTML_6_0 CHTML6.0対応機種の場合記述します。HTML変換結果はCHTML6.0になります。(0.9.0時点ではCHTML3.0と同じ)
    CHTML_7_0 CHTML7.0対応機種の場合記述します。HTML変換結果はCHTML7.0になります。(0.9.0時点ではCHTML3.0と同じ)
    XHTML_MOBILE_1_0 auのXHTML対応機種の場合に記述します。HTML変換結果はXHTMLになります。
    HDML auのHDML対応機種の場合に記述します。HTML変換結果はHDMLになります。
    JHTML SoftBankの端末の場合に記述します。HTML変換結果はSoftBank用HTMLになります。
  7. widthタグ
    端末の横幅を指定します。
  8. heightタグ
    端末の縦幅を指定します。
  9. gifタグ
    端末がgif画像を表示することができる場合(サポートしている場合)はtrueを指定します。表示できない(サポートしていない)場合はfalseを指定します。大文字、小文字の区別なし
  10. jpegタグ
    端末がjpeg画像を表示することができる場合(サポートしている場合)はtrueを指定します。表示できない(サポートしていない)場合はfalseを指定します。大文字、小文字の区別なし
  11. pngタグ
    端末がpng画像を表示することができる場合(サポートしている場合)はtrueを指定します。表示できない(サポートしていない)場合はfalseを指定します。大文字、小文字の区別なし
  12. bmp2タグ
    端末がbmp2画像を表示することができる場合(サポートしている場合)はtrueを指定します。表示できない(サポートしていない)場合はfalseを指定します。大文字、小文字の区別なし 通常はfalse。
  13. bmp4タグ
    端末がbmp4画像を表示することができる場合(サポートしている場合)はtrueを指定します。表示できない(サポートしていない)場合はfalseを指定します。大文字、小文字の区別なし 通常はfalse。
  14. colorタグ
    端末の表示可能色数。
  15. emoji_typeタグ
    auの場合に指定します。au以外の場合は指定しても意味はありません。
    設定できる値は以下のとおり。
    意味
    A 図柄タイプAをサポートしている場合に指定します。
    B 図柄タイプBをサポートしている場合に指定します。
    C 図柄タイプCをサポートしている場合に指定します。
    D 図柄タイプDをサポートしている場合に指定します。
    大文字、小文字の区別なし
  16. wp_widthタグ
    壁紙の横幅を指定します。Mode=WPで画像生成する場合、この値が使用されます。
  17. wp_heightタグ
    壁紙の縦幅を指定します。Mode=WPで画像生成する場合、この値が使用されます。
  18. cacheタグ
    ブラウザのキャッシュサイズを指定します。
  19. dpi_widthタグ
    端末の解像度。
  20. dpi_heightタグ
    端末の解像度。
  21. charsetタグ(0.9.0にて追加)
    端末に送信する文字コードを指定します。指定できる値はSJISかUTF-8のみ。


mod_chxjには、JPEG、GIF、PNG、BMPファイルを置いておくだけで、デバイス定義に従って、それぞれのキャリア対応のフォーマットに変換する機能があります。 画像のサイズ(縦X横)も、端末の画面サイズに合わせて変換します。 画像のサイズ(バイト数)については、デバイス定義中のキャッシュサイズを見て、その値よりも小さくなるように努力しますが、元の画像が 大きすぎる場合や、複雑な画像の場合には、キャッシュサイズよりも小さくできずに表示できない場合があります。
それぞれのタグで指定する場合には、ファイル名の拡張子(.jpgや.gif等)をはずした形で指定します。
本機能には3つのモードが存在します。そのモードを以下に記します。 端末側画面サイズの約3分の1程度のサイズ(縦X横)に画像を縮小表示します。 <IMG SRC="/img/logo?Mode=Thumbnail"> 端末側画面のサイズにマッチするサイズに拡大・縮小します。横長の画像の場合には、縦幅を合わせた後に左右をトリミングします。 <IMG SRC="/img/logo?Mode=WP"> 壁紙ダウンロードを行いたい場合に使用します。EzGETモードは、壁紙モードで出力される画像サイズと同一サイズの画像が使用されます。 <A HREF="/img/logo?Mode=EzGet"> モードの他に、画像サイズ(縦X横)を直接指定することも可能です。 wパラメータ、hパラメータを使用して指定します。
  1. wパラメータ
    横幅を指定します。
  2. hパラメータ
    縦幅を指定します。
  3. <IMG SRC="/img/logo?w=100&h=200">
  4. User-Agentパラメータ(uaパラメータ)
    User-Agentを指定します。指定した場合は、リクエストヘッダ中のUser-Agentを本パラメータの値で上書きします。 このパラメータに"IGN"を指定した場合は、User-Agentを無視します。Thumbnailモード、壁紙モードと併用時は、 640x480を元に画像サイズを算出します。
上記全てのモード、パラメータはGETリクエストとしてのみ使用できます。
QRコード出力機能を使用するには、QRコードハンドラを登録します。 httpd.confに以下の記述を追加します。 AddHandler chxj-qrcode .qrc なお、ハンドラを登録しないでも、出力フィルターを経由させることで、QRコードを出力させることも可能です。(※QRコードの動的出力を参照) ハンドラを登録したら、その登録した拡張子を持つファイルを用意します。 <?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の4つです。
  3. modeタグ modeタグは出力するQRコードの生成に利用するモードを指定します。 使用できるモードは、NUM(数字モード)ALPHA(英数字モード)8BIT(8ビットバイトモード)KANJI(漢字モード)です。
  4. sizeタグ sizeタグは1モジュールを何ピクセルであらわすかを指定します。 0を指定した場合は、4を指定した場合と同じ動作をします。  使用できるサイズは、0〜20までです。
  5. dataタグ dataタグは、QRコードに出力するデータを指定します。改行した場合は、改行文字もQRコード内に符号化されます。
プログラム等を使用し、動的にQRコードを出力したい場合は、上記の.qrcファイルの内容をそのままOutputFilterに通してあげればOKです。つまり、ChxjConvertRuleディレクティブで"EngineOn"と指定したURIが指すディレクトリに設置すれば良いということです。mod_chxj内部で、Content-Typeがtext/xmlの場合、QRCode用のファイルであるかどうかを一度読み込んで判断するので、Content-Typeには、text/xmlを設定してください。 <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をシミュレートします。本機能を有効にするためにはChxjConvertRuleディレクティブを使用する必要があります。ChxjConvertRuleディレクティブの第2パラメータにCookieOnを指定します。 ChxjConvertRule "^/chxj.+$" "EngineOn,CookieOn" "NONE" Cookieシミュレートでは、aタグ、imgタグ、formタグのURL部にOne-Time IDを埋め込むことで実現します。 そのため、ユーザがブラウザの戻るボタン等で戻った場合はCookieを取得できなくなります。 Cookieの内容はサーバ側に保存されます。 デフォルトではDBMを使用し、保存ディレクトリはChxjCookieDirディレクティブを使用することで指定することができます。指定しなかった場合は、/tmpに保存されます。 ChxjCookieDir /var/abc DBMの代わりにMySQLやmemcachedを指定することもできます。その際は、ChxjCookieDirは指定する必要はありません。 MySQLを使用するには、configure時にMySQL COOKIE機能を有効にして、コンパイルする必要があります。Buildの項参照 memcachedを使用するには、configure時にMEMCACHE COOKIE機能を有効にして、コンパイルする必要があります。Buildの項参照 またMySQLを使用する場合には以下のディレクティブを指定する必要もあります。
  1. ChxjCookieMysqlHost
    MySQLサーバの動作するホストを指定します。 ChxjCookieMysqlHost "localhost"
  2. ChxjCookieMysqlPort
    MySQLサーバのポート番号を指定します。 ChxjCookieMysqlPort 3306
  3. ChxjCookieMysqlDatabase
    MySQLサーバのデータベース名を指定します。 ChxjCookieMysqlDatabase "test_db"
  4. ChxjCookieMysqlUsername
    MySQLサーバに接続する際に使用するユーザ名を指定します。 ChxjCookieMysqlUsername "roottest"
  5. ChxjCookieMysqlPassword
    MySQLサーバに接続する際に使用するパスワードを指定します。 ChxjCookieMysqlPassword "pwtest"
  6. ChxjCookieMysqlSocketPath
    MySQLのソケットパスを指定します。 ChxjCookieMysqlSocketPath "/tmp/mysql.sock"
  7. ChxjCookieMysqlCharset
    MySQLのエンコードを指定します。 ChxjCookieMysqlCharset "utf8"
  8. ChxjCookieMysqlTablename
    MySQLのクッキーを保存するテーブル名を指定します。 ChxjCookieMysqlTablename "chxj_cookie" 上記のように"chxj_cookie"と指定すると、実際に作成されるテーブルは、chxj_cookieとchxj_cookie_expireテーブルの2つになります。
memcachedを使用する場合には以下のディレクティブを指定する必要もあります。
  1. ChxjCookieMemcacheHost
    memcachedの動作するホストを指定します。 ChxjCookieMemcacheHost "localhost"
  2. ChxjCookieMemcachePort
    memcachedのポート番号を指定します。 ChxjCookieMemcachePort 11211
ChxjCookieTimeoutディレクティブで保持期間を指定することができます。指定しなかった場合は1800秒でサーバに保存されているCookieは削除されます。 <Location /> ChxjCookieTimeout 10 </Location> 上記の例は、10秒でタイムアウト(サーバから削除)するように指定しています。
DoCoMo端末などのRefererに対応していない機種のためにRefererシミュレート機能を提供します。 本機能は、Cookieシミュレート機能を有効にすると、自動で有効になります(将来的には変更予定)。