Home > Mobile

Mobile Archive

Debian/GNU Linux etch に mod_chxj をインストールしたよ

携帯電話向けにコンテンツを変換する Apache モジュールの mod_chxj が約1年半ぶりにバージョンアップしていたのでインストールしてみました。

deb パッケージだと Apache2.2 に対応していないのでソースからビルドします。

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

  1. Apache2.0のヘッダーファイル群
  2. Apache2.0用のapxs
  3. apr(Apache Portable Runtime)ライブラリとそのヘッダファイル郡(apu含む)
  4. automake、autoconf、libtool1.3.X
  5. ImageMagick(MagickWand)
  6. libiconvまたはlibiconv_hook
  7. Linux

と、ありますので、libapr や libmagick を aptitude でインストールしておきます。

libconv は http://ftp.gnu.org/pub/gnu/libiconv/
libconv の日本語パッチは http://www2d.biglobe.ne.jp/~msyk/software/libiconv-patch.html にありますので、それぞれ wget して gzip -dc libiconv-1.12-ja-1.patch.gz | patch -p1 とパッチをあててからインストールします。

$ wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.12.tar.gz
$ tar xvzf libiconv-1.10.tar.gz
$ cd libiconv-1.10
$ wget http://www2d.biglobe.ne.jp/~msyk/software/libiconv/libiconv-1.12-ja-1.patch.gz
$ gzip -dc libiconv-1.10-ja-1.patch.gz | patch -p1
$ ./configure
$ make
$ sudo make install

という感じ。

次に mod_chxj のダウンロードとインストール。

$ wget http://osdn.dl.sourceforge.jp/modchxj/28979/mod-chxj_0.8.1p1.src.tar.gz
$ tar vxzf mod-chxj_0.8.1p1.src.tar.gz
$ cd mod-chxj_0.8.1p1

こんな感じで解凍したら、エディタで ./src/chxj_cookie.c を開きます。
120行辺りに下記のコードがありますので、ap_run_http_method(r), をコメントアウトして下さい。

if (! has_refer) {
    apr_uri_parse(r->pool,r->uri, &parsed_uri);
    refer_string = apr_psprintf(r->pool,
                                "%s://%s%s",
#if AP_SERVER_MAJORVERSION_NUMBER == 2 && AP_SERVER_MINORVERSION_NUMBER == 2
                                ap_run_http_scheme(r),
#else
                                ap_run_http_method(r),
#endif
                                r->hostname,
                                apr_uri_unparse(r->pool,
                                                &parsed_uri,
                                                APR_URI_UNP_OMITSITEPART));
    if (r->args && strlen(r->args)) {
      refer_string = apr_pstrcat(r->pool, refer_string, "?", r->args, NULL);
    }
    apr_table_setn(new_cookie_table, REFERER_COOKIE_KEY, refer_string);
    DBG1(r, "ADD REFER[%s]", refer_string);
    has_cookie++;
  }

次にコンパイル&インストール。

$ ./buildconf.sh
$ ./configure --prefix=/usr --with-apache-header=/usr/include/apache2 --with-apxs=/usr/bin/apxs2 --with-iconv=/usr/bin/iconv --with-apr-config=/usr/bin/apr-config --with-apu-config=/usr/bin/apu-config
$ make
$ sudo make install

こんな感じです。

インストールできたらソースパッケージの中にある etc ディレクトリの xml ファイルを /etc/apache2/chxj などという名前のディレクトリを作成してコピーします。
インストール時にモジュールをロードする設定ファイルが Apache のモジュール設定ファイルのディレクトリにコピーされているはずですが、されていなかった場合にはソースパッケージの debian ディレクトリにある chxj.load を適時コピーして下さい。

設定は http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/modchxj/mod_chxj/doc/modchxj.html?rev=1.20#doc1_102 を参考にして下さい。

僕は試しに mb サブドメインでバーチャルホストを立てて

<virtualHost *>
      ServerName mb.example.com
      DocumentRoot /var/www/mb/httpdocs
	<directory /var/www/mb/httpdocs>
		Options FollowSymLinks MultiViews ExecCGI
		AllowOverride All
	</directory>
	ChxjLoadDeviceData  /etc/apache2/chxj/device_data.xml
	ChxjLoadEmojiData   /etc/apache2/chxj/emoji.xml
	ChxjConvertRule "^/chxj.+$" "EngineOn" "UTF-8" "PC"
	<location /images>
		ChxjImageEngine On
		ChxjImageCacheDir /tmp
	</location>
</virtualHost>

という風にしました。
絵文字や画像のキャリアごとの差異を web プログラム側で気にしなくても良いのはとても素晴らしいことですね。

mobircをDebian Etchにインストール

keitairc をベースに作られたという mobirc を Debian Etch にインストールしたので、そのときのメモ。

ソースのチェックアウト

svn checkout http://svn.coderepos.org/share/lang/perl/mobirc/trunk/mobirc/

モジュール

perl つかってないのでガツガツモジュール入れました。
sudo cpan -i Module::Install からはじまって

Module::Install
Kwalify
Plagger
POE
List::MoreUtils
HTTP::MobileAgent
POE::Component::IRC
POE::Component::Server::TCP
POE::Component::Client::Twitter
POE::Filter::HTTPD
POE::Sugar::Args
Proc::Daemon
Template
Template::Provider::Encoding
Template::Plugin::JavaScript
UNIVERSAL::require
URI::Find
strict
CSS::Tiny
XML::LibXML
HTML::Selector::XPath
Mobirc::Util
Test::Base

sudo apt-get install libxml-libxml-perl

という感じ。よくわかりません。

perl Makefile.PL
make test

して、モジュールたりないよ><と言われたらモジュール追加。の繰り返し。

設定

cp config.yaml.sample config.yaml

してから config.yaml を編集。

plugin:

Mobirc::Plugin::Authorizer::BasicAuth

アクセスした際の Basic 認証

Mobirc::Plugin::Component::IRCClient

接続する IRC サーバとその設定
(接続するサーバの文字コードは incode で指定)
http:
ページの設定

という感じ。 http: で指定した port: がサーバのポート番号。
./mobirc でサーバ起動。なにもメッセージがでてこなければ大丈夫っぽい。
サーバに http でアクセスするとページが表示されます。
あとは server で /join #team-one とか打てばチャンネルに join

./mobirc --daemonize

でデーモン化

まとめ

Dan the 404 not found

テスト

SA390113.jpg

テステス

携帯電話のIPアドレス範囲テーブル

このエントリは[http://spais.jp/output/mobileip]に移動しました。

携帯電話各キャリア(au, DoCoMo, SoftBank WILLCOM)で利用している携帯電話用のIPアドレス範囲を DB 化しました。
MySQL でテーブルをダンプしたやつですが、よろしければお使い下さい。
zip 圧縮したクエリ
up したクエリは MySQL 用ですがクエリを生成したスクリプトは下記のものですので、他のデータベースで利用される方は下記のスクリプトをちょちょっと書き換えてお使いいただいても結構です。
※データベースの接続には PEAR::MDB2 を利用してますので、そこらへんも普段ご利用のアレに置き換えていただければと思います。

<?php
$ip = array(
    'au' => array(
        '210.169.40.0/24',    '210.196.3.192/26',   '210.196.5.192/26',
        '210.230.128.0/24',   '210.230.141.192/26', '210.234.105.32/29',
        '210.234.108.64/26',  '210.251.1.192/26',   '210.251.2.0/27',
        '211.5.1.0/24',       '211.5.2.128/25',     '211.5.7.0/24',
        '218.222.1.0/24',     '61.117.0.0/24',      '61.117.1.0/24',
        '61.117.2.0/26',      '61.202.3.0/24',      '219.108.158.0/26',
        '219.125.148.0/24',   '222.5.63.0/24',      '222.7.56.0/24',
        '222.5.62.128/25',    '222.7.57.0/24',      '59.135.38.128/25',
        '219.108.157.0/25',   '219.125.151.128/25', '219.125.145.0/25',
        '121.111.231.0/25'
    ),
    'docomo' => array(
        '210.153.84.0/24',    '210.136.161.0/24',   '210.153.86.0/24'
    ),
    'softbank' => array(
        '202.179.204.0/24',   '202.253.96.248/29',  '210.146.7.192/26',
        '210.146.60.192/26',  '210.151.9.128/26',   '210.169.130.112/29',
        '210.169.130.120/29', '210.169.176.0/24',   '210.175.1.128/25',
        '210.228.189.0/24',   '211.8.159.128/25'
    ),
    'willcom' => array(
        '61.198.142.0/24',    '219.108.14.0/24',    '61.198.161.0/24',
        '219.108.0.0/24',     '61.198.249.0/24',    '219.108.1.0/24',
        '61.198.250.0/24',    '219.108.2.0/24',     '61.198.253.0/24',
        '219.108.3.0/24',     '61.198.254.0/24',    '219.108.4.0/24',
        '61.198.255.0/24',    '219.108.5.0/24',     '61.204.3.0/25',
        '219.108.6.0/24',     '61.204.4.0/24',      '221.119.0.0/24',
        '61.204.6.0/25',      '221.119.1.0/24',     '125.28.4.0/24',
        '221.119.2.0/24',     '125.28.5.0/24',      '221.119.3.0/24',
        '125.28.6.0/24',      '221.119.4.0/24',     '125.28.7.0/24',
        '221.119.5.0/24',     '125.28.8.0/24',      '221.119.6.0/24',
        '211.18.235.0/24',    '221.119.7.0/24',     '211.18.238.0/24',
        '221.119.8.0/24',     '211.18.239.0/24',    '221.119.9.0/24',
        '125.28.11.0/24',     '125.28.13.0/24',     '125.28.12.0/24',
        '125.28.14.0/24',     '125.28.2.0/24',      '125.28.3.0/24',
        '211.18.232.0/24',    '211.18.233.0/24',    '211.18.236.0/24',
        '211.18.237.0/24',    '125.28.0.0/24',      '125.28.1.0/24',
        '61.204.0.0/24',      '210.168.246.0/24',   '210.168.247.0/24',
        '219.108.7.0/24',     '61.204.2.0/24',      '61.204.5.0/24',
        '61.198.129.0/24',    '61.198.140.0/24',    '61.198.141.0/24',
        '125.28.15.0/24',     '61.198.165.0/24',    '61.198.166.0/24',
        '61.198.168.0/24',    '61.198.169.0/24',    '61.198.170.0/24',
        '61.198.248.0/24',    '125.28.16.0/24',     '125.28.17.0/24',
        '211.18.234.0/24',    '219.108.8.0/24',     '219.108.9.0/24',
        '219.108.10.0/24',    '61.198.138.100/32',  '61.198.138.101/32',
        '61.198.138.102/32',  '61.198.139.160/28',  '61.198.139.128/27',
        '61.198.138.103/32',  '61.198.139.0/29',    '219.108.15.0/24'
    )
);
//$DB = PEAR::MDB2
$pattern = '/^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\/([0-9]{1,2})$/';
foreach($ip as $career => $hosts){
    foreach($hosts as $iprange){
        if(preg_match($pattern, $iprange, $matchs)){
            $range = pow(2, (32 - $matchs[5]));
            for($i = 0; $i <$range; $i++){
                $decIP = ((($matchs[1] * 256 + $matchs[2]) * 256 + $matchs[3]) * 256 + $matchs[4]) + $i;
                $ipaddress = str_pad(decbin($decIP), 32, 0, STR_PAD_LEFT);
                $ipaddress = bindec(substr($ipaddress,  0, 8)).'.'.
                             bindec(substr($ipaddress,  8, 8)).'.'.
                             bindec(substr($ipaddress, 16, 8)).'.'.
                             bindec(substr($ipaddress, 24, 8));
                $values[] = "('$decIP', '$career', '$ipaddress')";
            }
        }
        if(isset($values)){
            $r = $DB->exec("INSERT `mobileip` (`decip`, `career`, `ipaddress`) VALUES ".implode(', ',$values));
            if(PEAR::isError($r)) die($r->getMessage());
            unset($values);
        }
    }
}

各キャリアのIPアドレス範囲について

各キャリアのIPアドレス範囲のデータソースは以下のとおりです。

使い方

使い方なんてのはそりゃあもう人それぞれかと思いますが、僕は認証システムに組み込んでおります。
が、これだけで決定するわけではなく、もちろん環境変数との整合性を以って確認をするようにしております。
認証システムに組み込むことによってPCでの認証と同じレイヤーで携帯電話の固体識別番号での認証が行えたりします。

そのほか

decip カラムは IP アドレスを10進数に変換した数値です。
MySQL であれば

SELECT `career` FROM `mobileip` WHERE `ipaddress` = '$ipaddress'

とかでキャリアが返ってきますので、環境変数との整合性を確認するキーとでもして下さい。

各キャリアの IP アドレス範囲は2007年9月25日現在のデータです。
もちろん各キャリアごと予告なくいきなり IP アドレス範囲が変わります。
各キャリアとも一般公開向けに IP アドレス範囲をデータ配信などというフレンドリーな窓口はございませんので、常に気を配って下さい。
また、up したクエリやスクリプトを使用して発生した障害や損害などいかなる問題についても僕は責任を取れませんので、ご利用の際は自己責任でお使い下さい。

2007/10/26追記

コメントでご指摘いただき、下記のようにスクリプトを修正いたしました。
Gyokimae さんありがとうございます!
無駄に処理を増やさない!PHP のお兄さんとのお約束を忘れていました!

<?php
$ip = array(
    'au' => array(
        '210.169.40.0/24',    '210.196.3.192/26',   '210.196.5.192/26',
        '210.230.128.0/24',   '210.230.141.192/26', '210.234.105.32/29',
        '210.234.108.64/26',  '210.251.1.192/26',   '210.251.2.0/27',
        '211.5.1.0/24',       '211.5.2.128/25',     '211.5.7.0/24',
        '218.222.1.0/24',     '61.117.0.0/24',      '61.117.1.0/24',
        '61.117.2.0/26',      '61.202.3.0/24',      '219.108.158.0/26',
        '219.125.148.0/24',   '222.5.63.0/24',      '222.7.56.0/24',
        '222.5.62.128/25',    '222.7.57.0/24',      '59.135.38.128/25',
        '219.108.157.0/25',   '219.125.151.128/25', '219.125.145.0/25',
        '121.111.231.0/25'
    ),
    'docomo' => array(
        '210.153.84.0/24',    '210.136.161.0/24',   '210.153.86.0/24'
    ),
    'softbank' => array(
        '202.179.204.0/24',   '202.253.96.248/29',  '210.146.7.192/26',
        '210.146.60.192/26',  '210.151.9.128/26',   '210.169.130.112/29',
        '210.169.130.120/29', '210.169.176.0/24',   '210.175.1.128/25',
        '210.228.189.0/24',   '211.8.159.128/25'
    ),
    'willcom' => array(
        '61.198.142.0/24',    '219.108.14.0/24',    '61.198.161.0/24',
        '219.108.0.0/24',     '61.198.249.0/24',    '219.108.1.0/24',
        '61.198.250.0/24',    '219.108.2.0/24',     '61.198.253.0/24',
        '219.108.3.0/24',     '61.198.254.0/24',    '219.108.4.0/24',
        '61.198.255.0/24',    '219.108.5.0/24',     '61.204.3.0/25',
        '219.108.6.0/24',     '61.204.4.0/24',      '221.119.0.0/24',
        '61.204.6.0/25',      '221.119.1.0/24',     '125.28.4.0/24',
        '221.119.2.0/24',     '125.28.5.0/24',      '221.119.3.0/24',
        '125.28.6.0/24',      '221.119.4.0/24',     '125.28.7.0/24',
        '221.119.5.0/24',     '125.28.8.0/24',      '221.119.6.0/24',
        '211.18.235.0/24',    '221.119.7.0/24',     '211.18.238.0/24',
        '221.119.8.0/24',     '211.18.239.0/24',    '221.119.9.0/24',
        '125.28.11.0/24',     '125.28.13.0/24',     '125.28.12.0/24',
        '125.28.14.0/24',     '125.28.2.0/24',      '125.28.3.0/24',
        '211.18.232.0/24',    '211.18.233.0/24',    '211.18.236.0/24',
        '211.18.237.0/24',    '125.28.0.0/24',      '125.28.1.0/24',
        '61.204.0.0/24',      '210.168.246.0/24',   '210.168.247.0/24',
        '219.108.7.0/24',     '61.204.2.0/24',      '61.204.5.0/24',
        '61.198.129.0/24',    '61.198.140.0/24',    '61.198.141.0/24',
        '125.28.15.0/24',     '61.198.165.0/24',    '61.198.166.0/24',
        '61.198.168.0/24',    '61.198.169.0/24',    '61.198.170.0/24',
        '61.198.248.0/24',    '125.28.16.0/24',     '125.28.17.0/24',
        '211.18.234.0/24',    '219.108.8.0/24',     '219.108.9.0/24',
        '219.108.10.0/24',    '61.198.138.100/32',  '61.198.138.101/32',
        '61.198.138.102/32',  '61.198.139.160/28',  '61.198.139.128/27',
        '61.198.138.103/32',  '61.198.139.0/29',    '219.108.15.0/24'
    )
);
//$DB = PEAR::MDB2
$pattern = '/^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\/([0-9]{1,2})$/';
foreach($ip as $career => $hosts){
    foreach($hosts as $iprange){
        if(preg_match($pattern, $iprange, $matchs)){
            $range = pow(2, (32 - $matchs[5]));
            for($decIP = ((($matchs[1] * 256 + $matchs[2]) * 256 + $matchs[3]) * 256 + $matchs[4]), $decMaxIP = $decIP + $range ; $decIP <$decMaxIP; $decIP++){
                $ipaddress = str_pad(decbin($decIP), 32, 0, STR_PAD_LEFT);
                $ipaddress = bindec(substr($ipaddress,  0, 8)).'.'.
                             bindec(substr($ipaddress,  8, 8)).'.'.
                             bindec(substr($ipaddress, 16, 8)).'.'.
                             bindec(substr($ipaddress, 24, 8));
                $values[] = "('$decIP', '$career', '$ipaddress')";
            }
        }
        if(isset($values)){
            $r = $DB->exec("INSERT `mobileip` (`decip`, `career`, `ipaddress`) VALUES ".implode(', ',$values));
            if(PEAR::isError($r)) die($r->getMessage());
            unset($values);
        }
    }
}

携帯電話からの投稿テスト

携帯電話からの投稿テスト

テステス

ホーム > Mobile

Search
Feeds
Meta

Return to page top