【KtaiLibrary】勉強会前にバージョン0.1.1が出るかも…

icon_ktaiセッション周りで現在不具合が報告されていて、それを対処するバージョンが勉強会前に出るかもしれません。
先日の「世界一~」の通りに作っていただければたぶん不具合は出ませんが、session.saveを「php」ではなく別のものにするとセッションキーが張り付かないようです。これについては対処をしました。
その他、現象が分からないものがあるため、現在調査しています。その結果次第で、現在不具合が出ているものを全て直したバージョンとして0.1.1を出します。その際に、app_controller.phpを上書きしないように、拡張子を変更する対処を行いますので、新規インストールで若干手間は増えますが安全性は高まると思います。
現在勉強会の準備の方を優先していますので、間に合うかどうかは分かりませんが、出来るだけ間に合わせるように頑張りたいと思います。

また、ちょっとKtaiLibraryからは話がずれるのですが…
これは現時点で本決まりではないので、勉強会でのサプライズには間に合わないのですが(汗)、近日ビッグな報告が出来るかもしれません。今日はそのうち合わせで出かけてきたのですが、なかなか良いお話を貰えたため、モチベーション上がっています。とはいえまだまだ先の話なので、こちらの方は進展ありましたらまたご連絡いたします。

【KtaiLibrary】各キャリア携帯サイトを世界一簡単に作ってみる

icon_ktaiクォーターパウンダーのCMで、北島康介とかがでかいことを言っているのですが、なんでこういう内容なのか、やっと意味が分かったんですよね…最近。ビッグマウスで食えってことなのね(^^;;;

というわけで、タイトルがかなりビッグマウスなんですけど、考えてみたら制作チュートリアル的なものが何処にもなかったので、ちょっと書いてみることにします。
一応、近日開催の勉強会でも内容は一通りなめる予定ですが、ネットで様子をうかがっている感じ、制作で困っていらっしゃる方も何名かいらっしゃるようなので、先行で説明させていただきます。
お役に立てれば幸いです。

今回は、とりわけ需要が高いと思われる「セッション使用」「コンポーネント有り」「ヘルパー有り」「絵文字画像有り」「一括変換はなし」という前提でご説明いたします。

準備

構築に際して、つぎのものをまず準備します。

  • CakePHP
    まずPCで普通に見れるよう、いつもの設定を行う。
    オールグリーンに。
  • Ktai Library
    ダウンロードして解凍しておく。
  • TypePadの絵文字画像
    こちらもダウンロードして解凍しておく。

インストール

Ktai Libraryと絵文字画像をインストールします。
Ktai Libraryのイメージは、CakePHPのイメージに準拠しておりますので、基本的に丸ごとコピーで大丈夫です。
最後に、絵文字画像を「app/webroot/img/emoicons」に展開します。

routes.phpの変更

routes.phpを開き、Named separatorの設定を「処理の一番最初に」行います。

【app/config/routes.php】


Router::connectNamed(array(), array('argSeparator' => '~'));
Router::connect('/', array('controller' => 'mypages', 'action' => 'index'));    //ついでにホームの変更も

コントローラの作成

Cake本体の設定は概ね終わりです。今度はコンテンツ部分の設定になります。
まず最初にコントローラを設置します。
今回はセッションの動作をチェックするよう、セッション値のカウントアップとリダイレクト処理を入れてみます。

【app/controllers/mypages_controller.php】


<?php
class MypagesController extends AppController {

var $name = 'Mypages';
var $uses = array();    //とりあえず
var $components = array('Ktai');
var $helpers = array('Ktai');
var $layout = 'mypages';

var $ktai = array(
'use_img_emoji' => true,
'input_encoding' => 'SJIS',
'output_encoding' => 'SJIS',
);

function beforeFilter(){
Configure::write('App.encoding', 'Shift_JIS');    //UTF-8ではないエンコーディングの場合に必要な処理
}

function index(){
//アクセスする度にカウントアップさせる
//(Ktai Libraryとは全く関係ない処理です)
//
$counter = $this->Session->read('Ktai.counter');
$counter++;
$this->Session->write('Ktai.counter', $counter);
$this->set('counter', $counter);
}

function red(){
//リダイレクトするだけ
//
$this->redirect('/mypages');
}

}

layout・viewの作成

とりあえず簡単に、layoutとviewを用意します。
今回はSJISページとして設定していますので、view等はSJISで制作します。

【app/views/layouts/mypages.ctp】


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<?php if($ktai->is_iphone()){ ?><meta name="viewport" content="width=260"><?php } ?>
<title><?php echo $title_for_layout; ?></title>
</head>
<body>
<?php if(!$ktai->is_ktai()){ ?><div style="width: 240px;"><?php } ?>
<div align="center">
****************<br>
世界一簡単な<br>
各キャリア対応サイト<br>
****************<br>
</div>
<?php echo $content_for_layout; ?>
<?php if(!$ktai->is_ktai()){ ?></div><?php } ?>
</body>
</html>

【app/views/mypages/index.ctp】


現在のカウンターは「<?php echo $counter; ?>」です<br>
<br>
<?php echo $ktai->link('更新', '/mypages', array('accesskey' => 1)); ?><br>
<?php echo $ktai->link('リダイレクト', '/mypages/red', array('accesskey' => 2)); ?><br>

【app/views/mypages/red.ctp】
(一応ブランクファイルを作っておく)

app/tmp/cache/persistentディレクトリ内のフラッシュ

念のために、persistentをフラッシュします。
これをしないと、今回Ktai Libraryで追加したapp_controller.phpが反映されません。
意外に陥りやすい罠です。

実行

いよいよ実行です。
mypages(もしくはホーム)にアクセスしてみてください。
どうですか?
カウンターが更新されていますか?

最後に

paginateとかも説明した方が説得力あるのですが、「世界一簡単に」ではなくなってしまいそうなのでやめました(大汗)。
また、一括変換系も説明されていませんが、また次の機会にでも説明したいと思います。

あ、ちなみに設定値をかなり省略していますが、サーバ環境によっては若干変えなければならないパラメータがあるかもです(例えば絵文字画像の格納場所とか)。

とりあえず今回はここまで。

【CakePHP】beforeRedirectに関する挙動について

cake-logo先日、こちら のエントリで話題が出て、チケットも投げてみたのですが、invalidになってしまったのでちょっと記事として書いておきますね。

簡単に書きますと、複数の「beforeRedirectを持ったコンポーネント」をコントローラ内に設置してredirectを呼んだ場合、urlを含む各パラメータが「一番最後に呼ばれたbeforeRedirectの値」になってしまうという問題があります。
つまり、Ktai Libraryを設置し、もしiMODE端末でアクセスされた場合にsidをくっつけるとして、他のbeforeRedirectを含むコンポーネントを設置した場合、場合によってはセッションが切れてしまう問題が発生してしまうのです。

オフィシャルの見解として、1.2ではそのようなパターンは想定外とのことで、1.3に向けての拡張として提案して欲しい、ということでした。まあ、beforeRedirectを必要とするコンポーネントはそうないでしょうから、このような現象は一般的にはそんなに起きないでしょうけど、Ktai Libraryとしては不具合の発生しそうな方法をとることが出来ませんから、今回のapp_controllerで対応したことに関しては結果として良かったと思います。

まあ今回分かったことは、1.2でbeforeRedirectを使う場合は少し注意がいる、ということですね。

【KtaiLibrary】KDDI端末で絵文字「0」が「10」で表示される

icon_ktaiとても恥ずかしいミスが見つかりました。
数字0の絵文字が、KDDI端末で数字10となってしまいます。
0.0.2リリース後に見つけて修正し、0.1.0に盛り込むつもりでいたのですが、いつの間にか先祖返りをしてしまったようです。大変にお恥ずかしい…

修正バージョンの公開は早急に考えますが、とりあえずの対処コードを書いておきます。

【lib3gk.php 1026行】


array(0xf7c9, 0xf0c9),

ohgmaさん、ご指摘いただいてありがとうございました。

【KtaiLibrary】バージョン0.1.0公開!

icon_ktaiお待たせいたしました!
Ktai Library 0.1.0の公開を開始しました。
上記タブ「Ktai Library for CakePHP」からダウンロードできます。

繰り返しになりますが、構築済みサイトにKtai Libraryを適用する場合は、app_controllerを上書きしないように、特に気をつけてください。バックアップをとることをお薦めいたします。

今後のバージョンアップについてですが、現在 app_controllerに書いているリダイレクト対応を、将来的にはコンポーネント中で行うようにしたいと考えています。他の記事でも書いていますが、現在のCakePHPで実装されています「beforeRedirectコールバック」が想定していない実装になっているためで、チケットを投げている最中です(regenさんありがとうございます)。修正されたら、Ktai Libraryも修正を行い、さらに手間のかからない導入が出来るようにしたいと考えています。
機能的なバージョンアップは、後は細々としたものになりそうです。GPS対応とか、そういったものになりそうです。また、現在い携帯SCOについて勉強を始めたところでして(遅すぎ?)、そういったものも興味あります。もしアイデアなどありましたら是非お寄せください。

【追記】
ダウンロードページの0.1.0のファイルリンクが間違っていました。
0.0.2版がダウンロードされてしまった方は再度ダウンロードし直してください。
申し訳ございません。

【KtaiLibrary】0.1.0RC2に移行/リリースは11日昼頃予定

icon_ktai「Ktai Library0.1.0」のバージョンがRC2となり、特に問題が発生しなければこのままリリースをいたします。
毎度毎度のお願いで申し訳ございません。テストサイトで実機でのチェックを是非お願いいたします。

現在のコードは先ほどまでテストサイトで稼働していましたRC1とそれほど変わらないのですが、いくつか機能追加しました。

まず、セッション名を任意で変えられるようにしました。Cakeの設定のままuse_trans_sidを有効にしてしまうと、「?CAKEPHP=ほにゃらら」となってしまいちょっと恥ずかしいので。なのでiMODEに限ってsession_nameを変更することにしました。

それから、標準で仮名変換(mb_convert_kana())を盛り込みました。オプション文字列を指定すると、絵文字等の変換プロセスでコンバートを行います。デフォルトはコンバートしません。
まあ自動コンバート系はおまけみたいなもので、あまり推奨はしません。めちゃくちゃ処理が重くなりますので。基本的には元のファイルの方を何とかしましょう(笑)。

現状思いつく機能は盛り込みましたので、特に問題が出なければ11日(月曜日)の昼頃にリリースを考えています。
特に今回のバージョンのセッション対応はなかなか面白い工夫が出来たというのか、かなりやりがいを感じました。どういう解決方法なのかというのはダウンロードしたソースコードを見てもらうとして、改めてCakePHPの奥の深さというのか、オープンソースとしてのソフトウェア制作の醍醐味というのか、そういうのを感じました。そして、今までいろいろなアイデアを提供していただいた皆様や、情報を公開されている皆様、そしてテストサイトで実機テストをしていただいた皆様にも大変感謝しています。いつもありがとうございます。

【CakePHP】第4回勉強会のメインセッションにて「Ktai Library」をご紹介させていただきます

cake-logoえ~、正直私自身もビックリしていますです、はい(^^;;;

主催者のyandodさんから先日お話しをいただきまして、次回CakePHP勉強会@東京のメインセッションにて、Ktai Libraryのお話しをさせていただくことになりました!
こんなに光栄なことはありません!!

▼Event Entry::第4回CakePHP勉強会@Tokyo
http://events.php.gr.jp/events/show/77

まだ内容は未定なのですが、近日発表予定である0.1.0をベースに、特に0.0.2以降の新機能の話を中心としたものになるかと思います。
20分とのことですので、あまり詳細までの解説は出来ないとは思いますが、Ktai Libraryを用いての高速開発の魅力を少しでも伝えられたらと思っています。
少なくとも、「CakePHPカンファレンス東京」の時のような失態はしないようにしないと(^^;;;;;

というわけで、あまり期待はせずに、生温かい目で見守ってくださいませ(笑)。

【KtaiLibrary】0.1.0RC1に移行しました

icon_ktaiバージョンを0.1.0RC1とし、問題がなければリリースしたいと考えています。
特にDoCoMoをお持ちの方にセッション関連のテストをしていただけると嬉しいです。

今回は、今更になってしまうのですがiMODEシミュレータ(II)を導入しまして、こちらでも軽いiMODEチェックが出来るようになりましたので、セッション周りは一通り試しました。beta版は全然ダメでしたが、修正が入ってとりあえず正しく動くようになったかと思います。また、namedパラメータ付きのテストが入っていなかったので、追加しました。

そして、肝心のリダイレクト実装に関してですが…
一晩悩み、結局はapp_controller.phpを添付する方向で実装することにしました。リダイレクトはauthだけでなくscaffoldやsecurityでも使っていますので、外部でどうこうするのはやはり無理があるという結論です。
なので、新しく制作する場合はapp_controller.phpをまずコピーしてもらい、制作中のサイトで既にapp_controllerがある場合はredirect関数の部分をペーストしていただくことになります。

一桁(?)の時はライブラリの丸ごとコピーで動作したのでとても簡単でしたが、今回からは、このapp_controller.phpの件と、それからroutes.phpのnamedセパレータの修正が必要になりますので、是非注意していただきたいと思います。

app_controllerといえば、ちょっとはまってしまったのでご紹介。
初めてapp_controllerを設置する場合は、tmp/cache/persistent内をフラッシュしないと、更新されないので注意。何故かというと、App::import(というかtreeかも)でパスをキャッシュしているんですよね。フラッシュしないとcake/libs/controllers/app_controller.phpを読み続けます。
これはapp_controllerの他に、app_modelとか、デフォルトがあるものは全部が対象になるかと思います。

【KtaiLibrary】0.1.0beta版をテストしています

icon_ktaiとりあえず0.1.0のβ版をテストサイトに上げました。

本当はAuthを実装してテストした方が良いのかもしれませんが、今回省略しています。
というのは、Authのリダイレクトに対応していないからです。
出来るだけコンポーネントとヘルパー内で完結したいと思っていましたので、今回はコンポーネント内に入れたのですが、やっぱりリダイレクトはAppControllerに実装しなければならないのかもしれません。

どうやったら一番スマートか、ちょっと考えてみます。
場合によっては0.1.1も覚悟しています。

【KtaiLibrary】次バージョン(0.1.0)をGW明けに公開予定!

icon_ktaiお待たせしていましたKtai Libraryの次バージョンをGW明けに公開しようと思っています。

仕組み部分のソースコードは結構前から準備していたのですが、半分は仕事関連で忙しかったこと、もう半分は先日にお騒がせしていたnamedパラメータのセパレータ問題で方針が決まっていなかった事があります。セパレータを直さない方向でも模索していましたが、やはりリスクが大きいため、「携帯対応にはセパレータ変更が必須」という事にはなってしまいますがこの方向で実装を決定することにしました。

上記問題があったとはいえ、セッション対応が完了することでようやく携帯サイトに関する最低限の機能をひとまとめに出来たことになり、とりあえずはライブラリを組み込むだけで各キャリア対応のサイトが出来ることになると思います。まだまだいろいろやり足りない部分はあるのですが、それは追々増やしていこうと思っています。

明日あたりからテストサイトの方で準備をし始め、新機能に関する情報を追加していく予定です。
おたのしみに。