mod_chxjはオープンソースの携帯向けコンテンツ変換Apache2.x用モジュールであり、CHTML(DoCoMo i-Mode用CHTML3.0)で記述された文書や通常のHTMLで記述された文書を、アクセスに来た端末のUser-Agentヘッダを見て、それぞれの端末にあった形式に変換します。HTML文書に限らず、画像(jpg、gif、png)、絵文字についても、定義ファイルに従ってそれぞれのキャリアにあった絵文字に変換します。Cookie非対応端末、Refer非対応端末のために、Set-Cookie、CookieヘッダやRefererヘッダをシミュレートすることもできます(EXPERIMENTAL)。(1)
mod_chxjをインストールする前に、下記のものを用意する必要があります。
mod_chxjはこちらからダウンロードすることができます。
以下にmod_chxjインストール手順を示します。
Configureスクリプトを生成します
$ ./buildconf.sh
Configure
以下は、/usr/include/apache2.xに、Apache2.xのヘッダーファイルが存在する場合です。
$ ./configure --with-apache-header=/usr/include/apache2.x
$ make
$ make install
データの設置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
以下はmod_chxjが/usr/lib/apache2/modulesディレクトリ配下に設置されたものとしています
例として、Locationが"/chxj"以下のものは全て変換する場合を説明します。
#==================================================================================== # モジュールを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"
#==================================================================================== # モジュールを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"
#==================================================================================== # モジュールを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>
httpd.confに以下を追加します。下記は、URIが/imgで始まる全ての画像に対して動作するようmod_chxjに指示しています。
<Location /img> ChxjImageEngine On ChxjImageCacheDir /tmp ChxjImageCopyright "A.Konno" </Location>
上記の説明を以下に示します。
ChxjImageEngine
mod_chxjの画像変換ハンドラを起動するよう指示しています。DefaultはOff
ChxjImageCacheDir
mod_chxj画像変換ハンドラが使用する変換後の画像をおいておくディレクトリを指定します。デフォルトは/tmp。
ChxjImageCacheDir /tmp
mod_chxjに画像変換キャッシュとして/tmpを使用するよう指示します。
ChxjImageCopyright
mod_chxjの画像変換ハンドラに、転送禁止設定を行うよう指示します。パラメータとして任意の文字列をとります。ChxjImageCopyrightディレクティブで指定された文字列は、それぞれのイメージのコメント部に埋め込まれます。
ChxjImageCopyright "A.Konno"
mod_chxjに転送禁止設定を行うよう指示しています。変換後イメージのコメント部分には、キャリア毎に以下の文字列を埋め込みます。
AU の場合
kddi_copyright=on,A.Konno
DoCoMoの場合
copy="NO",A.Konno
Vodafoneの場合は、レスポンスヘッダに
x-jphone-copyright:no-transfer
を埋め込みます。(5)
httpd.confに以下を追加します。下記は、URIが/chxjで始まる全てのコンテンツに対して動作するようmod_chxjに指示しています。サーバ側はEUC-JPであった場合の例です。mod_chxjによってSJISに変換するように指示しています。サーバ側がShift_JISで無い場合は、Shift_JISコードの10進参照文字列表記を記述することによってShift_JISコードの絵文字2バイトコードに変換しクライアントへ返します。
ChxjConvRule "^/chxj.+$" "EngineOn" "EUC-JP"
上記の説明を以下に示します。
ChxjConvertRule
サーバサイドの文字コードを指定します。ここに、EUC-JPと指定してあった場合は、EUC-JPからCP932に変換後、クライアントに出力されます。省略した場合はNONE
ChxjLoadDeviceData /etc/apache2/device.xml
ChxjLoadEmojiData /etc/apache2/chxj/emoji.xml
ChxjImageEngine On
ChxjImageCacheDir /tmp
ChxjImageCacheDir "chosakuken jyoho"
第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
ChxjCookieDir
クッキーを使用する場合に指定します。クッキーの内容を保存するディレクトリを指定します。指定しない場合は/tmpに保存されます。
<Location /> ChxjCookieDir /tmp </Location>
詳細は「Cookieシミュレート機能」の項を参照ください。
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 | ○ | ○ | ○ | ○ | |
type | ○ | ○ | ○ | ○ | text,password,hidden,radio,checkbox,submitに対応 | |
value | ○ | ○ | ○ | ○ | ||
istyle | ○ | ○ | ○ | ○ | ||
<SELECT< | name | ○ | ○ | ○ | ○ | |
size | ○ | × | ○ | ○ | HDMLでは無視します | |
<OPTION> | value | ○ | ○ | ○ | ○ | (7) |
checked | ○ | ○ | ○ | ○ | ||
<DIV> | align | ○ | ○ | ○ | ○ | |
<HR> | ○ | ○ | ○ | ○ | ||
<CENTER> | ○ | ○ | ○ | ○ | ||
<IMG> | src | ○ | ○ | ○ | ○ | |
<CHXJ:IF> | lang | ○ | ○ | ○ | ○ | lang="chtml" lang="xhtml" lang="hdml" lang="jhtml"が指定できます |
<CHXJ:IF>
<CHXJ:IF>タグと</CHXJ:IF>タグではさまれたタグやテキストは、変換せずにそのまま(8)出力します。必須の属性として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>
i-Mode用の絵文字を書いておけば、アクセスしたキャリアによって、mod_chxjが対応の絵文字に自動変換します。ソースに2byteのバイナリコードを直接書いても、10進参照文字列(9)(&#XXX;の形)で書いても、どちらでも変換対象になります。10進参照文字列で書いた場合は、mod_chxjにより、自動で2バイトコードに変換します。
絵文字の変換に関する動作を変えたい場合(例えば「ハートがあったら、AUの場合はスペードに」とか、「変換定義がおかしい」といった場合)は、emoji.xmlファイルを直接編集することによって定義を変更することが可能です。emoji.xmlはXMLファイルとなっていますので、vi等で簡単に定義を変更することができます(10)。
以下に、emoji.xmlファイルの一部を記します。
<?xml encoding="Shift_JIS" > <emoji> <set> <no>1</no> <imode> <hex1>f8</hex1> <hex2>9f</hex2> <string></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>タグまで)とし、キャリア毎の絵文字を定義しています。
emoji.xmlに定義されていない絵文字で、変換したい絵文字がある場合には、このファイルに新たな定義を足せば、変換するようになります。
mod_chxjの動作を決定付ける重要な定義です。変換対象の端末は全て、device_data.xmlファイルに定義される必要があります。定義されていない端末は、mod_chxjとしては、認識することができません。認識できない場合には、変換せずにそのまま出力します。ただし、Perl互換の正規表現によって定義できるため、正規表現の書き方によっては全ての機種に対応させることも可能です。
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パラメータを使用して指定します。
<IMG SRC="/img/logo?w=100&h=200">
上記全てのモード、パラメータは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要素から成り立ちます。
プログラム等を使用し、動的に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の内容は、サーバ側に保存されます。保存ディレクトリはChxjCookieDirディレクティブを使用することで指定することができます。指定しなかった場合は、/tmpに保存されます。
ChxjCookieDir /var/abc
ChxjCookieTimeoutディレクティブで保持期間を指定することができます。指定しなかった場合は1800秒でサーバに保存されているCookieは削除されます。
<Location /> ChxjCookieTimeout 10 </Location>
上記の例は、10秒でタイムアウト(サーバから削除)するように指定しています。
DoCoMo端末などのRefererに対応していない機種のためにRefererシミュレート機能を提供します。本機能は、Cookieシミュレート機能を有効にすると、自動で有効になります(将来的には変更予定)。