読者です 読者をやめる 読者になる 読者になる

Zopeでケータイサイトを作ろうとした

Zope Mobile

Python忘年会で「回ってくればZope/Ploneアドベントカレンダーを書いてもいい」と発言してしまったところ、本当にt2yさんから回ってきました。

正直、Zope/Ploneは今日はじめて触ったくらいなのでネタに困るところですが、僕は仕事ではケータイサイト関連しかやっていないということで、「Apacheをフロントにしてmod_chxjを使えば、Zope/Ploneで結構簡単にケータイサイトを作れるんじゃないかなー」と考えていたら、すでに先達がいました。というか、このアドベントカレンダーの首謀者Takanoriさんの記事です。

この時点で次の方にバトンを回したいところですが、ここで終わると申し訳ないのと、実はZopeだけではなくmod_chxjも初めて触ってみるので、頑張って自分でもやってみます。

【追記】
ひがしやまさんによる20日目の「Plone でサイトを作ろう」も公開されましたのでご覧ください!

Zopeをインストールする

まずはzope.jpやt2yさんの記事を参考にして、チュートリアルからやってみます。

Zope/Ploneの導入は、CentOSならばEPELレポジトリを追加しておけば、

$ sudo yum install zope plone
$ sudo /sbin/service zope start

で起動まで簡単にできるので楽ですね。ただ、

http://127.0.0.1:8080/manage

でアクセスする管理画面に入るパスワードが分からなくて、

$ sudo /usr/lib64/zope/bin/mkzopeinstance.py

とコマンドを叩いてパスワードファイル(/var/lib/zope/inituser)を生成するところが、「すでにZopeインスタンスディレクトリがあるのにこれを実行するのか?」と少々戸惑いました。このパスワードファイルは、チュートリアルの「 一般ユーザーを追加する」にある通り、一般ユーザを追加するまでの一時的なものなのでしょうか。

mod_chxjをインストールする

mod_chxji386版ならば本家サイトからRPMをダウンロードできるようでしたが、僕の環境がx86_64だったのでソースに含まれているspecファイルを改変して自分でRPMを作りました。その時のspecファイルはこの記事の最後に張ってあります。

mod_chxjをインストールしたApacheから、同じホストの8080番ポートで動いているZopeへのリバースプロキシを設定します。

ProxyRequests Off

<Proxy *>
  Order deny,allow
  Allow from all
</Proxy>

ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/

ページを編集してみる

まず、こちらのページを参考にしながら、標準で使う文字コードutf-8に設定します。

その上でindex.htmlを次のような単純な内容に書き換えて、

<html>
<body>
<div style="text-align:center;">こんにちはZope&#xE6F7;</div>
<p>コンニチハ、コンニチハ&#xE695;</p>
</body>
</html>

次のようなmod_chxjの設定を行い、試してみます。

LoadModule chxj_module modules/mod_chxj.so
ChxjLoadDeviceData /etc/httpd/chxj/device_data.xml
ChxjLoadEmojiData  /etc/httpd/chxj/emoji.xml
ChxjConvertRule "^/.*$" "EngineOn,Z2hOn" "utf-8"

やりたい事は、

といったところです。

FireMobileSimulatorを使ってアクセスしてみると、docomoだと、

<html>
<body>
<div>こんにちはZope&#xE6F7;</div>
<p>コンニチハ、コンニチハ&#xE695;</p>
</body>
</html>

というHTMLが返ってきました。うーん、半角への変換は期待した通りだけど、style属性が削除されてしまいました・・・おそらくContent-Typeをxhtmlにしていないからだと思うのですが、ZopeでContent-Typeを制御する方法まで分からず、ここは未解決・・・

auだと、

<?xml version="1.0" encoding="Windows-31J"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN"
 "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<div>こんにちはZope&#xE6F7;</div>
<p>コンニチハ、コンニチハ&#xE695;</p>
</body>
</html>

SoftBankだと、

<?xml version='1.0' encoding='Shift_JIS' ?>
<!DOCTYPE html PUBLIC "-//J-PHONE//DTD XHTML Basic 1.0 Plus//EN" "html-basic10-plus.dtd">
<html>
<body><div>
<div>こんにちはZope&#xE6F7;</div>
<p>コンニチハ、コンニチハ&#xE695;</p>
</div></body>
</html>

というHTMLが返ってきました。mod_chxjが、XML宣言とDTDを自動的に付けてくれるのは便利かもしれませんが、絵文字の変換は行われていないな。Unicode形式だとmod_chxjは自動変換してくれないのか・・・

といった具合に、Zopemod_chxjも初めて触ったので、微妙な感じで時間切れとなってしまいました。

ただ、最近はケータイサイト・アプリケーション開発はmod_chxjのようなアプローチをとった方が楽(utf-8を前提にしているPythonアプリケーション/ライブラリはそのまま使って、utf-8以外の文字コードを使いたいならば別のレイヤーで変換を行った方が楽)だと感じ始めてきているので、習熟すればまずまずいい感じでケータイサイトができるのではないかと予想しています。

というわけで、Zope暦半日の人間がZope/Ploneアドベントカレンダー19日目をお送りしました。(たぶん来年以降アドベントカレンダーが回ってこない限り、もうZope/Ploneには触らないと思います。えー。)

次はひがしやまさんにお願いします。


とりえあずこれだけでは寂しいので、今回自分用にmod_chxjx86_64版のRPMを作った時のspecファイルを貼り付けておきます。CookieMySQLバックエンドを省略している点と、libmemcachedを共有ライブラリ版を使うようにしているところが、本家のRPMと違います。

%define version 0.12.37

Summary: CHTML to HDML,XHTML,JHTML convert module for Apache HTTPD.
Name:  mod_chxj
Version:  %{version}
Release:  1
License:  Apache License Version 2.0
Group: System Environment/Daemons
Vendor: Atsushi Konno
URL: http://sourceforge.jp/projects/modchxj/
Source:  http://sourceforge.jp/projects/modchxj/downloads/33637/mod-chxj_%{version}.src.tar.gz
#Source1: http://download.tangent.org/libmemcached-0.23.tar.gz
Packager:  Atsushi Konno <konn@sourceforge.jp>
Requires: ImageMagick >= 6.2.8.0, httpd >= 2.2.3, apr >= 1.2.7, apr-util >= 1.2.7, openssl >= 0.9.8, libmemcached >= 0.23
BuildPreReq: httpd-devel ImageMagick-devel gcc-c++ libtool openssl-devel libmemcached-devel
Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

%description
The contents conversion middleware for domestic main carrying (three careers)
is made as a module for Apache2.0. UserAgent is seen when contents made with
CHTML are output and it converts it into HDML, XHTML, and JHTML (The image :
to JPG, GIF, JPG, GIF from PNG, and PNG and BMP). With QR code generation
function.

%prep
%setup -q -n mod-chxj_%{version}

%build
%configure --enable-memcache-cookie \
            --with-memcached-header=%{_includedir}/libmemcached \
            --with-memcached-lib-dir=%{_libdir}
%{__make} DESTDIR=$RPM_BUILD_ROOT

%install
%{__rm} -rf $RPM_BUILD_ROOT
%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/httpd/conf.d
%{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/httpd/chxj
%{__mkdir} -p $RPM_BUILD_ROOT%{_libdir}/httpd/modules
%{__install} -m0644 support/centos/chxj.conf $RPM_BUILD_ROOT%{_sysconfdir}/httpd/conf.d/chxj.conf
%{__install} -m0644 etc/emoji.xml $RPM_BUILD_ROOT%{_sysconfdir}/httpd/chxj/emoji.xml
%{__install} -m0644 etc/device_data.xml $RPM_BUILD_ROOT%{_sysconfdir}/httpd/chxj/device_data.xml
%{__make} -C src make_so
%{__install} -m0755 src/mod_chxj.so $RPM_BUILD_ROOT%{_libdir}/httpd/modules/mod_chxj.so

%files
%defattr(-, root, root)
%doc AUTHORS ChangeLog COPYING
%config(noreplace) %{_sysconfdir}/httpd/conf.d/chxj.conf
%config(noreplace) %{_sysconfdir}/httpd/chxj/emoji.xml
%config(noreplace) %{_sysconfdir}/httpd/chxj/device_data.xml
%{_libdir}/httpd/modules/mod_chxj.so