MobilePictogramConverter 1.2.0 リリースのお知らせ
遅れましたが、明けましておめでとう御座います。 (汗
今年も宜しくお願い致します。
今年、初日記です。
MPCについては色々とお問合せ頂きありがとうございます。
遅れましたが、新バージョン(1.2.0)のリリースをさせて頂きたいと思います。
変更点は以下の通りです。
変更
- ライセンスをLGPLからMITへ変更
- 各絵文字変換ロジックを大幅に変更
修正
以前のバージョンをお使いの方は、そのままファイルを上書きして頂ければ問題ありません。
各メソッドの引数については1.1.1と同様となっています。
また、本年度もMPCの開発はガツガツ進めて行きます。
EUC-JPへの対応の要望が以外と多いので、そちらも対応していく予定です。
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つあります。
【第一引数】 (必須)
変換対象の文字列
【第二引数】 (必須)
※掲示板等の場合、UserAgentで判断すると良いかも
第一引数で指定した文字列の絵文字キャリア
以下の定数を指定する事が可能です。
【第三引数】 (必須)
第一引数で指定した文字列の文字コード
以下の定数を指定する事が可能です。
【第四引数】
第一引数で指定した文字列の絵文字体系
以下の定数を指定する事が可能です。
- MPC_FROM_OPTION_RAW (バイナリコード) ※デフォルト
- MPC_FROM_OPTION_WEB (Web入力コード)
- 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の処理速度自体は速くないので、キャリア毎にキャッシュを保存しておくのが理想です。
MobilePictogramConverter 1.1.0 リリースのお知らせ
MobilePictogramConverter 1.1.0 リリースのお知らせです。
かなりのコード修正が入っているので、以前のバージョンを使用されている方は早急にアップデートする事をお勧めします。
とりあえず、変更点は以下の通り。
対応/追加
修正/変更
以上です。
不具合などがあればご報告して頂けると有り難いです。