【CakePHP】「詳解CakePHP辞典(CakePHP辞典2)」を刊行しました!

大変にお待たせしました!

ご好評いただきました「Pocket詳解CakePHP辞典」の続編、「詳解CakePHP辞典(通称CakePHP辞典2)」が3/15日に無事刊行となりました。基本的に本書はCakePHPバージョン2系対応本ですが、前書でページ数の都合上なくなく削った機能の解説を追加し、より多くの情報を詰め込んだ「これぞ辞典!」と言える内容となっています。

facebookのECWorksページでも若干紹介させていただいていますが、本書が前作と比較してどのような変化があったか、また多くの方からご要望のある「電子書籍化」について、執筆時のエピソード的なものを交えてちょっと書こうと思います。

前作と変わったところ

Amazon等の書籍紹介ページをご覧になりますと、前作とあまり変化がないように見えますが、書店等で実物をご覧いただければ一目瞭然です。

  • 判型がひとまわり大きくなった
  • ページ数が増加
  • それでいて若干薄くなった
  • 紙質が柔らかなものとなりページが開きやすくなった
  • バージョン2系の現時点での全てのバージョンに対応(2.0〜2.3)
  • 前書で取り上げることが出来なかったクラスライブラリ・テスト等を収録
  • 本文中のクラスメソッドの収録順をアルファベット順にソート

…などなど

判型が大きくなった&ページ数の増加

本書ではバージョン2系から新しく搭載された、もしくは改良された機能は勿論、バージョン1系で収録できなかった機能についてもかなり盛り込んだため、結果として大幅にページ数が増加することが懸念されていました。
脱稿時に、前作換算でページ数を算定したところ、なんと1200ページ!! このままでは厚さ100%増しとなってしまいとても実用にはならなくなってしまうため、出版社側との議論の結果判型を大きくし、出来るだけページ数を増やさない方向で調整を行いました。
判型については「紙面が小さすぎ」「とてもPocketではない」とのご意見もあり、あの判型にこだわる必要もありませんでしたし、紙面が小さいことですぐに閉じてしまうなど逆に扱いにくいこともありました。なので丁度良かったのかもしれません。

それでいて若干薄くなった・柔らかい紙で開きやすくなった

ページ数はやや増加しましたが、本の厚さは若干薄くなりました。これは前作の紙が厚く硬めの紙だったため、柔らかく薄いものに変更したためです。このため開いたページが閉じにくくなりより扱いやすくなったと思います。
逆に、以前は硬い紙だったため自立が容易でしたが、本書は使い込んでくると立たなくなるかもしれません。

バージョン2系の現時点での全てのバージョンに対応

本書の発売は遅くとも3月であることが宿命づけられていた関係で、CakePHPのバージョンアップのタイミングに関してはかなり気をもんでいました。追記の可能な丁度良いタイミングで2.3がリリースされたため、本書にもその情報を盛り込むことが出来ました。本当に運が良かったです。
逆に、ページ数の都合からバージョン1系の情報はばっさりと削りました。両方の情報が載ってしまうと混乱するでしょうし。もしバージョン1系の情報が必要になりかつ前作をお持ちでない方は、是非「Pocket詳解 CakePHP辞典」の方をお求めください。しばらく併売されると思います(でも数量が減っているため入手はどんどん困難になると思われます)。

前書で取り上げることが出来なかったクラスライブラリ・テスト等を収録

前書ではページ数の都合から紹介できなかったクラスがあり、その中で「テスト」に関する仕組みを紹介できなかった経緯がありました。今回改訂版(実際には改訂どころか書き下ろしに近いのですが)ということで増ページが許され、テストをはじめとする多くの掲載できなかったクラスを盛り込みました。
テスト以外では、ファイル入出力やフォルダ管理に必要な「Fileクラス」「Folderクラス」、低レベルなネットワークアクセスを実現する「HttpSocketクラス」等、あまり情報として出回っていない仕組みについても掲載することが出来ました。

最後の最後まで悩んでいたのが「データソース」の周辺で、例えばCake標準でないデータベースにアクセスしたい場合やその他低レベルのデータ入出力インターフェースとしてデータベースの情報は必要になりますが、表面的にはモデルと似通った機能で構成されていること、解説をし出すと膨大で少々の増量では済まないこと、そもそもデータソースの利用やカスタマイズに関する情報は上級者向けのものが多い…等の理由で泣く泣く削りました。ただし、データソースのグループの中に「CakeSession」が含まれており、これだけは誰もが扱う重要な仕組みであるため、例外的に掲載しました。

また、テスト編の情報はあくまでも「Cakeで拡張された部分」のみの掲載となっています。Cakeのテストの仕組みは「PHPUnit」を オーバーライドあるいは別のクラスを利用して実現されているためPHPUnitの知識が必要になるのですが、本書でそこまでの解説をしてしまうともう1 冊分の情報量を詰め込むことになってしまいます。なので本格的なテストの記述についてはPHPUnitのマニュアルを参照していただくか、PHPUnit について書かれている別の書籍を併用していただいた方が良いと思います(PHPUnitの本はほとんど見受けられないので、誰か書いてくれないかなぁ…)。

紙の書籍ではやはり「ページ数との戦い」がどうしても発生してしまいます。これについては「完全電子書籍化」でない限りはなかなか難しいと思うのですが、紙の書籍でギリギリの情報量と実用性を考慮した上で今回の内容となりました。

本文中のクラスメソッドの収録順をアルファベット順にソート

辞典としての便利さの向上ということで「収録メソッド・プロパティ」をアルファベット順にソートしました。前書は「(頻度の高いものを除く)クラスファイル内での登場順」で掲載していました。これは「辞典で調べた後にソースコード内の該当箇所を検索しやすくする(もしくはその逆)」のためだったのですが、CakePHPをあまり知らない方にとってはソートされていた方が引きやすいだろうということで今回変更しました。

なお前書のAmazonの書評で「索引がクラス順にソートされているため、初級者だと機能を知らないので引けない」というコメントがあったのですが、最初メソッド名でソートをしてみたのですが、むしろこちらの方がわかりにくいのと、見た目的にも項目が不揃いで大変に見にくく難読であったため元に戻しました。基本的に内容が分からない場合は索引から入るのではなく本文から入っていただいて概要で判断していただいた方が分かりやすいのではないかと思います。

電子書籍版について

前書から散々に言われていて、今回もまだ未解決の事象として「電子書籍化」があります。確かにCakePHP辞典は電子書籍化された方が便利な事もあるのですが、おおむね次のような理由から実現に至っていません。

  • 出版社に電子書籍のインフラがないため
  • CakePHP辞典のそもそものコンセプトが「実務での紙で引くことの便利さ」であるため
  • CakePHPの認知度を上げるには紙媒体を優先した方が良いため

出版社に電子書籍のインフラがないため

電子書籍化ができない一番の理由は、現時点で出版社側に「インフラ」が無いためです。実は前書の時にも同様に言われ、議論もされたのですが、実現には至っていません。こればかりは出版社側の対応を待つしかありませんが、現場レベルでは十分に重要性を理解しており、電子書籍版について前向きであることは間違いありません。

コンセプトが「実務での紙で引くことの便利さ」であるため

これは私が100%オンラインで育っていない古い世代であるからかもしれませんが、やはり紙でペラペラめくることでの引きやすさは実務上で大変に役立つため、心情的に電子書籍よりも優先度が高いというのがあります。オンラインにはCookbookがありますし、ググって調べることも出来ますから、そちらで代用していただくことは出来るでしょう。
ただ、あくまでも優先度として紙の方が高いというだけで「電子書籍を出したくない」のではありません。現状出版が出来ない状況ですので、こればかりはどうしようもありません。

CakePHPの認知度を上げるには紙媒体を優先した方が良いため

ちょっと裏側の話になりますが…
電子書籍にこだわるのなら別の出版方法もありますが、やはり紙の本として出版することで書店に置いて貰うことが出来、またいろいろなオンラインストアなどでも取り扱って貰え、その結果googleの検索など多くの場所で「CakePHP」のキーワードが登場するようになるため、CakePHPの認知度を上げるためにはやはりまだ紙のほうが優勢だと思うからです。
例えば、自分の利益を優先するのであれば、出版社などを通さず個人的にKindle向けや別の電子書籍媒体を使って出版すれば、多分印税率は高く儲かると思います。ただ専門書の執筆で貰える印税はそれほど多くなく、実際のところ執筆にかける時間を別の案件などに使った方が遙かに上でして、電子書籍にしたところで大したことはないです。それよりは、CakePHPをより多くの方に使って貰いたい気持ちの方が上ですので、より効果的な方法として紙の方を優先しています。繰り返しになりますがあくまでも優先度の問題で、電子書籍「も」出せるのならそれに越したことはありません。

作業机の上の1冊に

本書はあくまでも「辞典」であり、この1冊でCakePHPの学習が出来るかどうかといわれると謎です。これは「英語の勉強を英和辞典1冊で出来るか」ということと同じで、CakePHPの学習には別の入門書を併用された方が良いと思います(例えば「CakePHP2 実践入門」のような素晴らしい本があります)。本書は、学習の過程で「より深くCakePHPの機能を知るため」あるいは学習を終え実践的な段階に入ったときに「こんな機能は無いのだろうか?」「こんな使い方は出来ないだろうか?」「この機能はどういう使い方だったっけ?」といった時に使っていただくための本で、いつも机の上に置いていただければと思います。Cake2が発表されてから1年以上立った今でもCake2の情報はネット上でもなかなか無いのが実情ですが、本書がよりCake2を便利に使っていただくための1冊になっていただければ幸いです。

詳解CakePHP辞典2.0/2.1/2.2/2.3対応

詳解CakePHP辞典2.0/2.1/2.2/2.3対応 [書籍]

著者滝下 真玄

出版社秀和システム

出版日2013-03-14 (木)

商品カテゴリー単行本

ページ数728

ISBN479803746X

Supported by amazon Product Advertising API

CakePHP2 実践入門 (WEB+DB PRESS plus)

CakePHP2 実践入門 (WEB+DB PRESS plus) [書籍]

著者安藤 祐介, 岸田 健一郎, 新原 雅司, 市川 快, 渡辺 一宏, 鈴木 則夫

出版社技術評論社

出版日2012-09-29 (土)

商品カテゴリー単行本(ソフトカバー)

ページ数416

ISBN4774153249

Supported by amazon Product Advertising API

WebデザイナーのためのCakePHPビューコーディング入門

WebデザイナーのためのCakePHPビューコーディング入門 [書籍]

著者滝下 真玄 , 原 一浩

出版社秀和システム

出版日2012-03-28 (水)

商品カテゴリー単行本

ページ数424

ISBN4798033146

Supported by amazon Product Advertising API

CakePHP2系の書籍

久しぶりのブログ更新です。
なかなかかけなくてスミマセン…

さて、更新が止まっているうちにCakePHPの本がいくつか出たり出したりしましたので、ここでまとめて書評&ご紹介いたします。

「CakePHP2実践入門」

CakePHPコミュニティで活躍されている皆さんが執筆された待望の一冊。以前は「CakePHPガイドブック」という本がありましたが、あれの改訂版とも言える内容です。CakePHPの概要的な話から始まり、コントローラ・モデル・ビューの作り方、ビヘイビア・コンポーネント・ヘルパー・プラグイン、ユニットテスト…といった基本的な使い方を押さえ、さらに現在のポピュラーなCakePHP開発の手法をこの一冊にまとめたといった感じです。

献本いただいて一通り読んでみましたが、この本のターゲットは「CakePHPを一通り触ってみた初級者〜中級者」が一番しっくりくるのではないかと思います。一度Cakeを触った方は、この本の随所にちりばめられた有用なTips・手法が大変に役に立つと思います。特にメール関連、デプロイ関連の章は即戦力でかなり役に立つと思います。

反面、「本当にCakePHP(あるいはMVCフレームワーク)が初めての方」には向いていないかもしれません。というのは、CakePHPのシステムが最初の段階である程度理解できていないと内容についていけないところが若干あります。例えば、一番最初の解説でモデルの解説がされていないのにモデルの話題が普通に出てきたりします(自分自身、一番最初のCakeの学習ではDBとモデルの関係性の理解に一番時間をかけたので、あの題材ならどちらかというとまずモデルの解説から入って欲しかった)。
ページ数も少ないため、全てのレベルの方に向けた本を一冊で完結するのは難しいでしょう。もしチュートリアル的に流れに沿って学習したいのであれば別の書籍も併用されると良いかもしれません(その「別の書籍」は後述で)。

豪華執筆陣の本だけあって中の情報は確かなものです。初級者は勿論、ある程度使い込んだ方でも持っていて損はないでしょう。幸いなことにCakePHPの書籍は他のPHPフレームワークと比べて沢山あるのですが、これぞ真打ち!的な本です。

CakePHP2 実践入門 (WEB+DB PRESS plus)

CakePHP2 実践入門 (WEB+DB PRESS plus) [書籍]

著者安藤 祐介, 岸田 健一郎, 新原 雅司, 市川 快, 渡辺 一宏, 鈴木 則夫

出版社技術評論社

出版日2012-09-29 (土)

商品カテゴリー単行本(ソフトカバー)

ページ数416

ISBN4774153249

Supported by amazon Product Advertising API

※「サンプルコードがない」という記述をしていましたが、githubで公開されているそうです。訂正します。
https://github.com/wdpress/CakePHP2_Practical_Guide

「オープンソース徹底活用 CakePHP2.1によるWebアプリケーション開発」

「CakePHP入門書」の定番であり、対応バージョンが1.2→1.3→2.1と改訂されていった伝統ある本です。入門書に徹した内容であり、プログラミング初級者でも分かりやすいです。
この本の魅力は「サンプルコードがダウンロード可能」な点で、そのコードを実際に動作させて学習できるところが良いと思います。また学習できる範囲もかなり絞り込まれており、最初には丁度良いです。本職のライターさんが書かれている本なので、解説が大変にわかりやすい! 私自身、「全く分からない人に伝える」というのが大変に難しくいつも苦労しているのですが、とても見習いたい部分です。

反面「2.1版なのに若干古い技術が使われているところがある」点があります。例えば、本編ではリクエストデータの取り出しに「$this->request->data」ではなく「$this->data」が使われてしまっています。今のところこれでも動きますが、推奨されたものではないためあまり良いとは言えません。それから詳細なCakeの学習には向いていないため、すぐに次の本が必要になる点かと思います。

オープンソース徹底活用CakePHP2.1によるWebアプリケーション開発

オープンソース徹底活用CakePHP2.1によるWebアプリケーション開発 [書籍]

著者掌田 津耶乃

出版社秀和システム

出版日2012-06-29 (金)

商品カテゴリー単行本

ページ数544

ISBN4798034185

Supported by amazon Product Advertising API

「WebデザイナーのためのCakePHPビューコーディング入門」

記事に書くのが大変に遅くなってしまったのですが、今年の春にGreativeの原氏と共著で発刊させていただきました。今までのCake本はほぼプログラマー向けに書かれたものですが、本書は「Webデザイナー向け」という野心的なものです(笑)。

本書を企画したきっかけは、昨年に開催際した「(第一回)デザイナー向けCakePHP勉強会」でした。懇親会等でいろいろなデザイナーさん・コーダーさんとお話させていただいた際に、「もっと勉強してみたい」という声がたくさんあったので、是非書籍にそのエッセンスをまとめられたらなと思い、企画を出版社に持ち込みました。デザイナーにあてたWebプログラミング技術書というのはあまり例がないため(スマホアプリ開発本はあると思いますが)、出版社側は冒険だったでしょうが、快く企画を通していただけました。

ちょっと余談になるのですが、当方はかなり前から「プログラマーとデザイナーのコラボレーション方法」という点でいろいろ模索していて、Smartyを使ってみたり、別のテンプレートを考案してみたり、「Tplcutter」というHTMLを切り出してビューにするものを開発してみたりしたのですが、こういった解決方法をするにしても、やはりシステムを理解して貰う必要がどうしてもあり、「フレームワーク」あるいは「MVC」といったものの共通認識は必要なんじゃないかと考えるようになりました。ただ、ノンプログラマー的な方が理解可能な書籍はなかなかないため(基本的にフレームワーク本はプログラマーの目から見ても十分難易度が高いと思う)、もっとしきいの低いところで実現する方法はないかと考えていました。本書の執筆の他にも、最近では「baserCMS」というCake製のCMSの開発に関係してますが、「CMSならデザイナーさんにもCakeを触って貰えるのではないか? テーマとか作れるようになったら、他のCake案件も頼めるのではないか?」というところで期待をしている感じです。

さて本書はデザイナー向けであって、内容はビュー周りの解説に徹しています…といいたいところですが、上述の通りある程度はそれ以外のパートの動きも知らないと話にならないため、極力最低限、全体の制作の流れを簡単に解説しています。基本的に全編通してチュートリアル形式になっていますが、サンプルコードがあらかじめスタートと完成形両方が収録されていて、確認が容易にできるようになっています。またサンプルの内容は「問い合わせフォーム」が題材になっており、表画面と裏画面の両方の制作を行うようになっています。Webの案件はほぼこの題材の応用でやっていけるでしょうから、必要最低限の学習で実践できるような内容にしました。

チュートリアル形式ということで、CakePHPの動作する環境が必要になるのですが、例えばローカルにXAMPP等を入れていると動かないケースがどうしても出てしまうので、本書では思い切って「バーチャルマシン」を用いてCakePHPの動作するLinux環境をダウンロードできるようにしました。具体的にはVirtualBoxを導入して仮想マシンファイルをサンプルダウンロードサイトから入手・展開し、本書の解説に従って進めていただければ極力環境依存がないようになっています(勿論、サンプルコード単体を入手して試すこともできます。
また、gitを使ってコラボレーションする方法や、CSSフレームワークである「Compass」を使ったりとか、かなりモダンな開発スタイルも解説したりしています。

本書の活用方法は、表題の通りデザイナーさん・コーダーさん向けの学習教材ではありますが、Cakeバリバリのプログラマーさんにも是非買っていただいて、案件でコーダーさんあたりに発注する際に「この本を読んで、ビューまで作って!」と言えるような内容を目指しました。むしろこちらがメインです(笑)。Cake案件で是非活用いただけますと、野望の一つが達せられる感じです。
幸いなことに、Amazonの書評で、初級者プログラマーさんにも役立つ本と好評いただいて、嬉しい限りです。ビュー以外の部分については、他の本で補っていただけると良いのではないかと思います。

WebデザイナーのためのCakePHPビューコーディング入門

WebデザイナーのためのCakePHPビューコーディング入門 [書籍]

著者滝下 真玄 , 原 一浩

出版社秀和システム

出版日2012-03-28 (水)

商品カテゴリー単行本

ページ数424

ISBN4798033146

Supported by amazon Product Advertising API

どの本を買ったら良い?

CakePHPの学習にあたって、「この3冊のどれをチョイスしたら良いか?」という点ですが、記事内でも若干指摘していますがまとめてみると…

上級者: (CakePHP2実践入門) (CakePHPビューコーディング入門)
中級者: CakePHP2実践入門 (CakePHPビューコーディング入門)
初級者: CakePHP2.1によるWebアプリケーション開発 or CakePHPビューコーディング入門 → CakePHP2実践入門

という感じと思います。カッコについては「あると便利」の位置づけです。
基本的に、どれが良い・悪いというのはなく、用途によってどれもオススメできる本です。

「CakePHP辞典2(仮)」について

最後に。

CakePHP1.2/1.3対応で書きました「CakePHP辞典」ですが、残念ながらCakePHP2系では仕様が変わってしまい、そのままで使うことは若干難しいです。そこで、「ビューコーディング入門」脱稿後から「辞典2」の執筆をスタートし、現在折り返し地点を過ぎたところです。
予定では、年内中には刊行できると思います。できるだけ早い段階で書店に並ぶように頑張っています。

Cake2になって仕様変更になった部分は網羅し、新しいクラスや仕組みについてもかなりの量を追加しています。前回収録できなかったテストについても予定しています。本当は全部掲載したいのですが、それだとものすごい量になってしまいますので、実務上問題ない範囲でできる限りの情報を詰め込んでいます。プロパティのオプション値についても、詳細に書いている点はもちろん従来と変わりません。
内容はざっと見積もりですがおそらくそのままいくと5割増しかと思います(!!!)。こうなってくると自立するどころではなくなってくるのですが、何らかの工夫をする予定です。

というわけで、若干お待たせしている辞典2ですが、鋭意執筆中なのでもう少しお待ちいただけますと幸いです。なお、ページの都合上バージョン1系には対応しておりませんので、バージョン1系をお使いの場合は現行の「CakePHP辞典」を併せてご利用くださいませ。

【CakePHP】リクルートエージェント様主催のイベントでトークさせていただきます

最近案件で追われていましてなかなかブログ更新できなくてスミマセン。

さて、このたびリクルートエージェント様が主催されているクリエイター向け勉強会で、当方がセッションを担当することになりました。12/15とちょっと告知が遅くなってしまい申し訳ございませんが、もしお時間がありましたら是非ご参加いただければと思います。

■タイトル

位置情報を用いた携帯webゲームの作り方と、事例紹介
GPS×携帯×PHPフレームワーク=地方活性コンテンツ!

■概要(紹介文より)

位置ゲーやチェックイン関連サービスの拡大など、何かと話題のジオメディア。
最近はスマホでの関連サービス展開が進んでいますが、
まだまだ携帯のシェアはフィーチャーフォン(ガラケー)がメイン。

今回は、フィーチャーフォンを含む携帯端末の位置情報活用をテーマに、
CakePHPでおなじみの滝下真玄さんを迎えて、
開発~ローンチまでの事例紹介を交えた勉強会を開催します。

地方活性や産学連携のテーマも含んだ、大変興味深い事例ですので、
ご興味をお持ちの方は、ぜひご参加ください!

また、勉強会の後は懇親会も実施します。
費用はいずれも無料。
ぜひお気軽にお申し込み下さい!

【主催】株式会社リクルートエージェント

■開催日・場所

2011/12/15 19:30~
リクルートGINZA7ビル(G7) (東京都中央区銀座7-3-5)

■参加費用

無料(懇親会費も無料です)

■参加申込み・その他

お申し込みおよびその他のご案内は ATND をご覧ください

先日、いただいた案件で「GPS位置情報を用いた携帯ゲーム」を制作しまして、現在サービス中なのですが、そのときの事例を交えて、PHPフレームワークを用いて高速にサイト開発をするための手法や、GPS機能についてのTipsなんかをお話しできればと思っています。

また、今回は話の流れ上「CakePHP」を用いての制作についてお話しいたしますが、決してこれに限らず、モダンなWebサイト開発においてフレームワークを用いることの重要性、そして当方が何故CakePHPを使っているのかについても触れてみようと思っています。なので、フレームワークをバリバリ用いている方よりは、これからフレームワークを使ってみたいと思っている方に是非ご参加いただきたい感じです。

それから、今回の案件は「地域活性化」というところでの立ち位置で、若干通常の案件とは異なる性質のものでした。ですが、地域性の高いサイトでの位置情報サービスは大変に有用だと感じているところです。位置情報サービスといいますと普通は地図上の1つの「点」の情報である場合がほとんどですが、今後はその点が拡張されて他のものになっていくと予想します。今回はその事例の一つと思いますので、位置情報サービスに興味のある方にも是非いらしていただきたいです(そして懇親会等でお話を聞いてみたいです)。

1時間程度の短い時間の中になりますが、是非よろしくお願いします。

【KtaiLibrary】バージョン0.4.2をリリースしました

Ktai Libraryの0.4.2をリリースしました。

本バージョンから、SoftBank携帯の絵文字出力について大きく変更があります。以前のバージョンではwebコードでの出力を行っていましたが、他のキャリアと同じくバイナリコードもしくは数値文字参照形式で出力されるようにしました。
これは、SoftBank側のSSLの扱いが変更になった関係で、SJISにてwebコードによる絵文字が見ることが出来なくなってしまったことがあります。

▼Mobile Creation : WEB & NETWORK : SSL/TLS
http://creation.mb.softbank.jp/web/web_ssl.html

また、ディズニーモバイルのメールアドレスからキャリア判別出来るようになり、QRコード作成でパラメータ生成で問題があった点を修正しました。あと現時点での機種情報とIPアドレス情報に更新しました(IPv4枯渇問題の影響か、各社対象IPアドレスが減っている点が興味深いです)。

【KtaiLibrary】バージョン0.4.1をリリースしました

Ktai Libraryの0.4.1をリリースしました。
今回はバグフィックスがメインになっています。

Lib3gkEmoji::emoji()で生成した絵文字をさらに自動絵文字変換を行っている際に文字化けしてしまう不具合がありました。これは emoji()の出力が既に対象キャリアの絵文字であるのに、その絵文字をdocomo絵文字と認識して再度変換をかけてしまっているためです。なので自 動絵文字変換処理の場合はemoji()ではdocomo絵文字を出力するように修正しました(以前のコードにはこの処理が入っていたけど絵文字コンバー ト手法を変更した際にそのコードを処分してしまったらしいです)。

また、Lib3gkCarrier::is_android()のラッパーメソッドがどこにも無いため追加しました。

あと、これは修正項目ではありませんが、docomoの比較的新しい機種で「SJISで拡張絵文字の数値文字参照形式(#xxxxx;)の絵文字を表示できない」現象を見つけました。P-01A等でこの現象が出ます。なのでSJISに関してはバイナリ絵文字を出力した方が良いようです。お気を付けください。

【Ktai Library】3G携帯の普及率を調べてみました(2010年9月現在)

Ktai Libraryの導入に伴い、3G携帯の普及率が気になっていらっしゃった方がいました。何故ならKtai Libraryは3G携帯対応であり、2G携帯は想定していないためです(一部使えますが)。

自分でも気にはなっていたため、近況を調べてみました。
以前調べたときは確か95%弱まで来ていたのですが…

▼総務省東海総合通信局:移動体通信(携帯電話・PHS)の普及状況
http://www.soumu.go.jp/soutsu/tokai/tool/tokeisiryo/idoutai_fukyuu.html

2010年9月現在の携帯普及率

想像以上でびっくり!
もう2Gは無視してしまって問題のないレベルじゃないでしょうか。
公式サイトでない限りは、Ktai Libraryは安心してお使いいただけるレベルかと思います。

というか、2G対応の手間をスマートフォン対策にかけていく時期がそろそろ来そうな気がします。

【BaserCMS】テーマファイルを安全に配置する方法

BaserCMS関連のTips続編です。

とにかく導入が楽でお手軽に使える事を目指しているBaserCMSですが、一つだけ個人的に良くないかなーと思う点があります。「テーマ機能」を用いて簡単にデザインを変えられる機能がありますが、ビューファイル(*.ctp)もドキュメントルート内に置く仕様になっているため、ctpファイル単体が閲覧できてしまう問題があります。

例えばTopページのビューは、インストール直後は「/themed/demo/pages/index.ctp」にあります。なので「http://www.example.com/themed/demo/pages/index.ctp」とすると次のように見えてしまいます。

PHPの関数コールが分かってしまう

ソースコードが丸わかり。ビューにコードをいろいろ書いてしまうと危険!

これはあまり気持ちの良い事ではないので、ビューファイルだけは見えないところに移動してみましょう。
テーマファイルは「app/webroot/themed/」以外に「app/views/themed/」内においても動作をします。そこで次の対処を行います。

  1. 「app/views/」内に「themed」ディレクトリを作成する
  2. さらに、対処したいテーマ名のディレクトリを「themed」内に作成する。今回は「app/views/themed/demo/」となる
  3. 「app/webroot/themed/demo」内にある「elements」「feed」「leyouts」「pages」を「app/views/themed/demo/」内に移動する

なお、これが可能なのは「webrootをドキュメントルートとしている」場合のみです。ドキュメントルート内にBaserCMS本体を置いて運用されている方は対処する事が出来ません。(2011.01.26追記:「スマートURL」設定であれば、どのようなインストール方法でも上記は有効です)
また、上記対処をする事で問題点もあります。管理画面上でテーマファイルの編集が出来なくなりますので、別の方法でファイルを直接扱わなければならなくなります。まあもっともプログラマーの方でしたら特に問題はないでしょう。

もしビューファイルの拡張子がphpでしたらPHPコードとして実行されるためエラーコードがはき出されるのみですみますが、そうでない場合は普通にテキストファイルとして入手できてしまうので、場合によっては脆弱を生む事になります。
まあこれはBaserCMSに限った事ではなく、CakePHPを丸ごとドキュメントルート内において運用する場合にも起こりうる問題です。ビューにはあまりコードを書かないようにするか、ちゃんとwebrootをドキュメントルートにした上で、上記のようにthemedからビューファイルを外に追い出した方が安全でしょう。

とはいえ、システムの方で一応ディレクトリを分ける対応をした方が問題がなさそうな気がします。丸ごとインストールされているとまあどうしようもないのですが…

【追記】(2011.01.26)

@nojimageさんから「.htaccessにAddHandlarでctpも加えたら」というアイデアをいただきました(ありがとうございます!)。
もしお使いのサーバで「.httaccessの編集権」「AddHandlar使用権」がある場合は、ctpファイルをPHPコードと見なす事で、webroot内にctpファイルがあっても、コードの中身を閲覧する事を(一応)防ぐ事が出来ます。
「app/webroot/.htaccess」に次のように記述します。


#インストールしているPHP環境によって書き方が違うかもしれない(下記はPHP5用)
AddHandler php5-script .ctp
AddType text/html .ctp

たいていの場合、内部のメソッド・関数が見つからないために致命的エラーとなり、閲覧が出来なくなります。
また、ドキュメントルートに丸ごとBaserCMSをインストールしている場合は「/(BaserCMSのインストールディレクトリ)/.htaccess」に記述する事でBaserCMS内の全てのctpファイルを防げます。

【BaserCMS】app/webrootをドキュメントルートにする場合の注意点

いままでBaserCMSの話題が全くなかったので、ちょっと取り上げてみようと思います。

あ、そうでした。
4月頃、東京で「BaserCMSの勉強会」の開催をもくろんでいます。興味がありましたら是非ご参加ください。またお手伝いいただける方、会場をちょろっとお借りできる会社様等ありましたら是非ご協力お願いいたします。
このへんについてはまた後日。

で本題なのですが、Bakerの皆さんがCakePHPを扱う場合、おそらくapp/webrootをドキュメントルートとしてサーバ設定をする事が多いと思いますが、同じようにBaserCMSもこのように設定すると、インストーラ実行後、表画面もしくは裏画面のどちらかがうまく表示されなくなってしまうかと思います。BaserCMSは標準ではドキュメントルート内にアーカイブ一式をコピーする事を前提で設定がされているため、いくつかの箇所で不具合を生じてしまいます。

app/webrootをドキュメントルートにする場合は次のようにします。

■修正1:.htaccessを次のように設定する


RewriteEngine on
#↓ここを修正
#RewriteBase /app/webroot
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

■修正2:app/config/core.php内の次の箇所を変更する


//↓ここを修正
//Configure::write('App.baseUrl', env('SCRIPT_NAME'));
 Configure::write('App.baseUrl', '');

インストール後うまくいかないようでしたら、たぶんこの辺が影響していると思います。
是非ご確認ください。

【CakePHP】「CakePHP新春勉強会」に行ってきました

CakePHPの勉強会が久々にありましたので参加しました。
大規模なイベントは昨年10月のPHP Matsuri以来となりますが、当方は顔を出したものの完全参加はできなかったので、実質昨年5月以来です。

さて、今回はいつもの「Ktai Library」ではなく、CakePHPで製作されたCMSアプリケーション「BaserCMS」をLTでご紹介させていただきました。スライド(をPDF化したもの)を公開いたします。


クリックするとpdfを参照できます

Cake界隈では「Croogo」あるいはかなり前から存在している「Wildflower」などがありますが、これらは日本向けのCMSではないため、かなりカスタマイズをしないと難しい点がありました。しかしBaserCMSは日本で開発されているため作りも日本向けであり、サポートもされやすいてんがメリットです。また「コーポレートサイト」が簡単に作れるよう機能的にも的を絞っており、他の(Cake以外の)CMSと比べてもコーポレートサイト向けなら導入する価値が大変にあると思います。

当方も開発メンバーでありますが、本業が忙しくてなかなか出来ないところがあります。しかし今年はちょっとてこ入れをしていくつかプラグイン等を作っていきたいと思っています。何故なら本業でも売っていきたいので(笑)。ネタはいくつか考えていますが、一般向けのものについては是非公開していきたいと思います。

で、BaserCMSは福岡では勉強会も回数をこなしており、普及を促している方もたくさんいらっしゃるため盛り上がっているのですが、残念なことに関東では情報がやってこないためなかなか認知度がありません。なのでまずはこの便利なCMSを知っていただきたいと思い、今回勉強会を開催してみようと思っています。Cakeを日頃お使いの方はもちろんですが、特にデザイナーの方にも知っていただきたいと思っております。是非デザイナーさんをお誘いのうえ参加していただけますと大変に嬉しいです。
現時点ではとりあえず「やる」と表明しただけで、何も決まっていない状態です。現実的になってきましたら改めて告知させていただきます。また手伝っていただける方、会場をお貸しいただける方(企業)も絶賛大募集です。まずは小さくと思っておりますが、関東でも是非盛り上げていきたいと思いますのでよろしくお願いします。

…と告知が長くなってしまいましたが(汗)、勉強会そのものも大変に楽しかったです。
内容については他の方がレポートされていますし、ちょっとまとめる時間もなさそうなので今回は割愛させていただきますが、CakePHP2.0は今年の大注目になりそうですね。

2次会はカラオケボックス内でLT大会になりました(笑)。しかもそれがUstされたり!
こんな事をするのはCakeメンバーくらいかもしれません。
第2回CakePHP温泉部」をはじめ、私もいろいろと企画したいと思います。

【Ustreamによる発表録画はこちら】

http://www.ustream.tv/channel/cakephpstudy#utm_campaign=unknown&utm_source=712880&utm_medium=social

【参加された方のブログなど】

http://techlog.knocking.co.jp/archives/190
http://d.hatena.ne.jp/deeeki/20110118/cakephp_newyear_study
http://blog.livedoor.jp/hamichamp/archives/51564338.html

【CakePHP】Shellを拡張してTaskで親シェルのメソッドが使える「ShellEx」クラス

CakePHPを利用するにあたり、基本的にはWeb上で動作するアプリケーションを作成すると思いますが、バックエンド等でCakeの機能を用いながら処理を実行したい場合も当然出てきます。そんなときは「シェル」が活躍します。みなさんシェルは活用されていますか?

CakePHP1.2/1.3では、シェルの中で「タスク」という小機能を呼び出す仕組みがあります。Shellの中に膨大な機能を全部押し込まなくても済むようになるためコードの可読性が上がり、大変に便利な機能です。膨大な機能を提供しているCake機能の一つ「Bake」も、コアコードを覗けば多数のタスクで構成されています。
使い方も簡単です。「app/vendors/shells/」内に、例えば「hoge_shell.php」を作成します。中身はShellクラスを継承した「HogeShell」クラスを作成します。そしてその中には「main()」メソッドを用意すれば動作します。詳しくは こちら をご覧いただくか「Pocket詳解 CakePHP辞典」をご覧ください(出来れば買って!(笑))。

さてここからなのですが、Taskを使う場合、ShellからTaskが呼ばれるのですが、Shell内は素通りしてしまうため例えばタイトルなどをShell内で制作しても表示されません。また、タイトルを表示するためのメソッドを作って共通化をはかろうとしても、タスクからは呼び出し元のシェルはアクセスが出来ないため、利用することが出来ません。タイトルに限らず、シェル内で利用したいプロパティ・メソッドがあってもアクセスが不可能のため利用不可能です。

そこで、タスク内から親シェルのオブジェクトを参照することが可能な機能を付加する「ShellExクラス」を作成してみました。やっていることは非常に簡単で、タスクの初期化時に親クラスのオブジェクト参照を付加するのみです。しかしタスクの初期化・スタートアップ・実行が全てシェルのinitialize()とstartup()の間に挟まれていますので付加するタイミングがありません。このため、ShellExクラスのinitialize()内でタスクの初期化を先行して行っています。タスク初期化は「Shell::loadTasks()」が行っていますが、結果として二度実行されます。
Shell::loadTasks()が二度実行されることで若干問題点があります。それは親シェル内にロードされる各タスクオブジェクトが1回上書きされることです。幸いだったのが、このとき上書きされるのはClassRegistry::getObject()で入手できる参照オブジェクトでした。実体ではないため、結果として同じオブジェクトになります。単純に無駄な処理が走るだけです。多少気持ち悪さは残りますが、とりあえず要求していた機能は実現できます。

ソースコードはgistに上げました。このファイルを「app/vendors/shells」等にアップロードし、シェル内であらかじめApp::import()でこれを読み込み、extendsを「ShellEx」にすれば動作します。ファイル名は「shell_ex.php」とします。

利用例


App::import('Shell', 'ShellEx');
class MyShell extends ShellEx {
	var $tasks = array('Mytask');

	function commonFunc(){
		//共通処理
		$this->out('MyShell::commonFunc()');
	}

	function main(){
		//メインで共通処理を呼び出します
		$this->commonFunc();
	}
}


App::import('Shell', 'ShellEx');
class MytaskTask extends ShellEx {
	function excute(){
		//共通処理を実行
		$this->parentShell->commonFunc();
	}
}

タイトル云々の話は、Ktai Library1.0のシェル関連機能を実装している最中に必要になりました。やっぱりオリジナルのタイトルは作りたいので(笑)。まあこのほかいくつか共通機能を実装したかったので、それだけのためって事はないですが…
また @hiromi2424 さんによりますと、CakePHP2.0ではShell機能は改良されているそうです。まあ今回の記事は思いっきりバッドノウハウですね(^^;。