MobilePictogramConverter 1.2.0 リリースのお知らせ

遅れましたが、明けましておめでとう御座います。 (汗
今年も宜しくお願い致します。

今年、初日記です。

MPCについては色々とお問合せ頂きありがとうございます。

遅れましたが、新バージョン(1.2.0)のリリースをさせて頂きたいと思います。

変更点は以下の通りです。


変更
  1. ライセンスをLGPLからMITへ変更
  2. 各絵文字変換ロジックを大幅に変更

修正

  1. i-mode絵文字を変換する際に発生していたエラーを修正
  2. EZweb絵文字を変換する際に、一部マルチバイト文字が絵文字と誤判断されていたバグを修正

以前のバージョンをお使いの方は、そのままファイルを上書きして頂ければ問題ありません。

各メソッドの引数については1.1.1と同様となっています。

また、本年度もMPCの開発はガツガツ進めて行きます。

EUC-JPへの対応の要望が以外と多いので、そちらも対応していく予定です。

MobilePictogramConverter-1.2.0 ダウンロード

Ethnaでモバイル セッション

前回の記事の続きです。

前回の設定でとりあえずは問題なさそうだったのだが、今日チェックしているとDoCoMoで問題が起きた。

DoCoMoでだけ、セッションが引き継がれない。

URLにセッションIDが引き継がれてないのかな?と思ったが、正常に引き継がれている。

少し悩んである事を思い出した。

Ethnaでセッション使うと記録される内容にIPアドレスが含まれてたな〜。

って事で、Ethna_Sessionを調べてみた。

Ethna_Sessionはリクエスト毎に、自動的に呼び出されて、CookieやURLにセッションIDがあれば自動でセッションを開始(Ethna_Session::restore)してくれる。

restoreの中身を見ていると以下の部分が気になった。

<?php
// check session
if ($this->isValid() == false) {
    setcookie($this->session_name, "", 0, "/");
    $this->session_start = false;
}
?>

isValidが通らなかったらセッションを消去してるぽい。

isValidでは不正なセッションだった場合、強制的にdestroyしてる。

で、その不正なセッションの判定の一部にセッションハイジャック対策のためか、
保持しているIPアドレスと接続元のIPアドレスが同じでなかった場合、不正とみなしている。


まさにこれが原因ぽい。

DoCoMoの場合、リクエスト毎にゲートウェイが変わるのでIPは毎回変わる。

恐らくこれだろうって事で、対策。

対策としては、まぁPCの場合はURLベースでやることはないだろうってことで

session.use_only_cookiesがtrueの時だけ、_validateRemoteAddrを実行するように変更。

先日の日記で作ったクラスにisValidメソッドを追加。

<?php
    /**
     *  セッションの正当性チェック
     *
     *  @access public
     *  @return bool    true:正当なセッション false:不当なセッション
     */
    function &isValid()
    {
        if (!$this->session_start) {
            if (!empty($_COOKIE[$this->session_name]) || session_id() != null) {
                setcookie($this->session_name, "", 0, "/");
            }
            return false;
        }
        
        // Cookieが有効時のみチェック (FOMA対策)
        if (ini_get('session.use_only_cookies')) {
            // check remote address
            if (!isset($_SESSION['REMOTE_ADDR'])
                || $this->_validateRemoteAddr($_SESSION['REMOTE_ADDR'],
                                              $_SERVER['REMOTE_ADDR']) == false) {
                // we do not allow this
                setcookie($this->session_name, "", 0, "/");
                session_destroy();
                $this->session_start = false;
                return false;
            }
        }
        
        return true;
    }
?>

DoCoMoで確認してみると、ちゃんと通った。

問題なさそうだね。

Ethna セッション

あまりに忙しくて日記もMPCも更新出来ていない…

今日はちょっとフレームワークのお話。

Ethnaを使ってPC・携帯両対応のサイトを作ってたんですが、

セッションがどうもおかしい。

トリガーで以下の様に定義してるんですが、PCの場合でもなぜかHTTPベース(GET, POST)でセッションが扱えてしまう。

<?php
/* PC */
if ($carrier == TARGET_CARRIER_IS_PC) {
    ini_set('session.use_cookies'     , 1);
    ini_set('session.use_only_cookies', 1);
} else {
/* Mobile */
    ini_set('session.use_cookies'     , 0);
    ini_set('session.use_only_cookies', 0);
    ini_set('session.use_trans_sid'   , 1);
}
?>

で、Ethna_Sessionを探ってみるとコンストラクタで以下の様な部分を発見。

<?php
if (strcasecmp($_SERVER['REQUEST_METHOD'], 'post') == 0) {
    $http_vars =& $_POST;
} else {
    $http_vars =& $_GET;
}
if (array_key_exists($this->session_name, $http_vars) && $http_vars[$this->session_name] != null) {
    $_COOKIE[$this->session_name] = $http_vars[$this->session_name];
}
?>

なるほど…、GETやPOSTでセッションIDを渡したらそれが優先されるぽい。

ってことで、まずはオーバーライドしたクラスを作成。

以下が作成したクラス。

<?php
class Common_Session extends Ethna_Session
{
    function &__construct($appid, $save_dir, $logger)
    {
        // session name
        $this->session_name = 'sess';
        $this->session_save_dir = $save_dir;
        $this->logger =& $logger;
        
        if ($this->session_save_dir != "") {
            session_save_path($this->session_save_dir);
        }
        
        session_name($this->session_name);
        session_cache_limiter('private, must-revalidate');
        
        $this->session_start = false;
        if (isset($_SERVER['REQUEST_METHOD']) == false) {
            return;
        }
        // モバイル時のみHTTP VARSのセッションID使用
        if (!ini_get('session.use_only_cookies')) {
            if (strcasecmp($_SERVER['REQUEST_METHOD'], 'post') == 0) {
                $http_vars =& $_POST;
            } else {
                $http_vars =& $_GET;
            }
            if (array_key_exists($this->session_name, $http_vars)
                && $http_vars[$this->session_name] != null) {
                $_COOKIE[$this->session_name] = $http_vars[$this->session_name];
            }
        }
    }
    
    function &Common_Session($appid, $save_dir, $logger)
    {
        $this->__construct($appid, $save_dir, $logger);
    }
}
?>

んでこれをコントローラーで読み込み。

<?php
require_once 'Common_Session.php';

class AppID_Controller extends Ethna_Controller
    var $class = array(
        'session'       => 'Common_Session',
    );
}
?>

これで携帯ではHTTPベース、PCではCookieベースのセッションが可能。



PS:
さっさと時間作って、MPCの開発を進めたい今日この頃。

MPCの開発手伝ってくれる優しい方はいませんかね><

MobilePictogramConverterの使い方について

使用方法がよく分からないとの意見があったので、今回は使用方法について説明しようと思います。

以下がMPCを使用する上で、最もシンプルなコードです。

<?php
require_once 'MobilePictogramConverter.php';

$str = pack('H*', 'F89F'); // DoCoMo 絵文字 (太陽のマーク)
$mpc =& MobilePictogramConverter::factory($str, MPC_FROM_FOMA, MPC_FROM_CHARSET_SJIS);
echo $mpc->autoConvert();
?>

上記コードの実行結果

これを実行すると、アクセス元のユーザーエージェントにより、各キャリアの絵文字に変換されます。

とりあえず、MPCに当たる部分を説明して行きます。


$mpc =& MobilePictogramConverter::factory($str, MPC_FROM_FOMA, MPC_FROM_CHARSET_SJIS);

上記コードは、キャリアにあったクラスをインスタンス化しています。
基本的に、変換対象はここで指定する引数で決まります。

引数は合計で4つあります。


【第一引数】 (必須)
変換対象の文字列


【第二引数】 (必須)
第一引数で指定した文字列の絵文字キャリア
以下の定数を指定する事が可能です。

  1. MPC_FROM_FOMA (i-mode 絵文字)
  2. MPC_FROM_EZWEB (au 絵文字)
  3. MPC_FROM_SOFTBANK (SoftBank 絵文字)
掲示板等の場合、UserAgentで判断すると良いかも


【第三引数】 (必須)
第一引数で指定した文字列の文字コード
以下の定数を指定する事が可能です。

  1. MPC_FROM_CHARSET_SJIS (Shift_JIS)
  2. MPC_FROM_CHARSET_UTF8 (UTF-8)


【第四引数】
第一引数で指定した文字列の絵文字体系
以下の定数を指定する事が可能です。

  1. MPC_FROM_OPTION_RAW (バイナリコード) ※デフォルト
  2. MPC_FROM_OPTION_WEB (Web入力コード)
  3. MPC_FROM_OPTION_IMG (imgタグ)

次の行で実際の変換を行います。

以下の1行ですね。


echo $mpc->autoConvert();

autoConvertメソッドは$_SERVER['HTTP_USER_AGENT']からアクセスキャリアを判別し、自動でキャリアに合う絵文字へ変換します。

初心者向けとして、autoConvertは実装しました。

上記だけでは、変換先絵文字キャリアや絵文字の体系を指定出来ません。

変換オプションを自分で設定したい場合には、autoConverメソッドの中身を見てみると幸せになれるかも。

ここまでで分からない事や質問事項があれば、コメントでお願いします。

サンプル公開

MobilePictogramConverter 1.1.1をリリースしました。

変更点は以下の通りです。


SoftBank公式には定義されていない絵文字(7種類)に対応

今回は、リリースのお知らせとは別に、MPCの使用例として3キャリア対応絵文字掲示板をご用意しました。

一応テストも兼ねていますので、絵文字が表示されない!等の不具合があれば、ご連絡頂ければ有り難いです。

SBの3G対策で、文字コードがutf8になっている為、もしかすると古い機種では見れないかもしれません…

http://php-develop.org/MobilePictogramConverter/bbs/

ソースコードは以下です。

http://php-develop.org/MobilePictogramConverter/bbs/index.phps

※あくまで使用例なので、セキュリティが甘いかもしれませんが、あまり気にせず…。



追記。

今のところ、MPCの処理速度自体は速くないので、キャリア毎にキャッシュを保存しておくのが理想です。

MPC 追加予定の機能

MPCがphpspotで掲載されていて驚きました。

今回は追加予定の機能について記事を書きます。

とりあえず、以下が追加予定の機能一覧です。


  1. メールに適切な文字コードへ変換
  2. 絵文字をunicodeへ変換
  3. オプションで指定した文字コードへ変換
  4. Willcomオリジナル絵文字に対応?

今考えてるのはこれくらいです。

Willcomの絵文字については、オリジナル(Willcom独自)絵文字に対応しようかと思っていますが、
Web上のフォームから、入力出来るのか調査してから、対応するかは決定します。
ちなみにAdvanced W-ZERO3 [es]では、入力出来たので、今のところ前向きに考えています。

他にも要望があれば、コメント頂けると有り難いです。

MobilePictogramConverter 1.1.0 リリースのお知らせ

MobilePictogramConverter 1.1.0 リリースのお知らせです。

かなりのコード修正が入っているので、以前のバージョンを使用されている方は早急にアップデートする事をお勧めします。

とりあえず、変更点は以下の通り。


対応/追加
  1. SoftBank絵文字のShift_JIS(バイナリコード)に対応
  2. 文字列に含まれる絵文字の数を返す、Countメソッドの追加

修正/変更

  1. PHP4で正常に動作しないバグを修正
  2. SoftBank絵文字(UTF-8)が正常に変換されないバグを修正
  3. EZweb絵文字(UTF-8)を変換する際に使用される、マップファイルを使用しない様に変更
  4. 定数名 MPC_CHARSET_SJISをMPC_FROM_CHARSET_SJISに変更
  5. 定数名 MPC_CHARSET_UTF8をMPC_FROM_CHARSET_UTF8に変更
  6. メソッド名 isEmojiをisPictogramに変更
  7. i-mode絵文字(Web入力コード)から他の絵文字へ変換する際に一部の絵文字が変換されないバグを修正
  8. コーディングルールを変更 (インデント等)

以上です。

不具合などがあればご報告して頂けると有り難いです。