CakePHPのfind()で取得したデータが全てstring型になるのを、DBのカラムの型に合わせてint型で値を取得する方法(mysql)


CakePHP2からはPDOを使ってDBアクセスするようになりました。PDO(mysql)では、デフォルト設定でデータをfetchするとint型のカラムでもstring型として結果が返ってきます。CakePHPもこの影響を受けており、jsonデータなどに変換する際や、型を厳密に扱いたい場合に影響がます。(CakePHP1では、PDOを使っていませんがintカラムはstringで返ってきます)


この問題を解決するには、PHP5.3以上の環境でPDOのPDO::ATTR_EMULATE_PREPARESをオフにすれば良いです。PDOがmysqlndドライバを利用することが前提なのですが、PHP5.4からはデフォルトでmysqlndドライバが利用されるので大丈夫です。今回はPHP5.4の環境で検証しました。

PHP5.3ではPDOがmysqlndドライバを利用するためにコンパイルオプションを指定するか、パッケージインストールでphp-mysqlndを入れるなどが必要です。
参考 http://stackoverflow.com/questions/13159518/how-to-enable-mysqlnd-for-php


mysqlndについてや、PDOとの関係などは下記の資料がまとまっています。
http://blog.layer8.sh/ja/2013/03/12/php-mysql-pdo-mysqlnd/


さて、CakePHP2でPDOのフラグオプションにPDO::ATTR_EMULATE_PREPARES = falseを指定すれば良いのですが、mysqlデータソースを見るとアプリケーション側から指定する仕組みがないため、コントローラの中などでPDOインスタンスを取得してセットすることにしましょう。
例えば、jsonを返すコントローラのアクションの中で下記のようにすればfindの結果は型が正しい状態で返ってきます。

<?php
$pdo = $this->Post->getDatasource()->getConnection();
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,FALSE);
var_dump($this->Post->find());

やっていることは、Postモデルを使って(モデルは何でも良い)、getConnection()でPDOインスタンスを取得します。
あとはPDOクラスのsetAttribute()メソッドでPDO::ATTR_EMULATE_PREPARESにfalseを指定しています。


もしアプリケーション全体でこのオプションを有効にしたい場合は、AppModelやAppControllerで上記の指定をしておくか、CakePHPMySQLデータソースを継承して、connect()メソッドをオーバライドして制御するなどすれば対応できるでしょう。

追記

akiyan先生からのご指摘で、タイトルが紛らわしいと気付いたので変更しました。ありがとうございました。

PHPからTwilioを使って電話を操作する発表をしました

FukuokaPHP第7回 1周年記念というめでたい日に、Twilioという電話APIサービスを使ってPHPから電話をかけたり、受けたりする話をしてきました。

当日のUstreamの動画はこちら
http://www.ustream.tv/recorded/33479457


懇親会は自分がよく行く舞鶴のビールバーでした。
クラフトビール 福岡 GASTRO PUB ALES
伊勢角屋ペールエールが美味しかったです。飲み干してもう無いけど。


Fukuoka.phpを1年前にAkase244さんと立ち上げてスタッフ5人ぐらいで楽しくやってきました。2年目もこんな感じで楽しくやっていきたいですね。


下記は、Fukuoka.phpの立ち上げのきっかけになったツイートです

「Unixという考え方」はやはり良い本でした

UNIXという考え方―その設計思想と哲学という本を読み終えました。
原著のタイトルはThe Unix Philosophyです。


これは1996年に出版された古い本ですが、Unixの考え方を通して、良いソフトウェアとは何かが分かる良書です。150ページほどしかないのですぐに読み終わります。
3月に大阪に行った時に、なんだか無性にこの本が読みたくなって、梅田の本屋で買って読んでました。


言っていることは、大体こんな感じ

  • 小さく、シンプルに保つ
  • 小さな機能を集めて、大きなシステムを構成する(柔軟さを持ったまま)
  • 出力はコンピュータが処理できるように
  • 最適化や速度よりも移植性


特に移植性の箇所が面白かったです。
"多少遅く動作しても、いつでも他の環境に乗り移るように移植性を持って作っておく方が良いこと"が印象的でした。
いま、遅くても次に新しいマシンができたら解決してしまう可能性が高いから。だからいつでも違うマシンに移れるように、今のマシン固有のハックをしないこと。

現在に受け継がれる思想

1つのことだけをうまくやる小さなプログラムを作り、それを自由に組み合わせられるようにしておくこと。そうすれば、大きな処理をしたい場合も、それらを組み合わせていけるし、柔軟性も上がる。重要なのはそれらが組み合わせできるように、ちゃんとプログラムが理解する出力をすること。
今でもWebでAPI公開して、マッシュアップして大きなものを作るってのにそのまま受け継がれてますよね。
あと、AmazonAWSのサービスは、個々のサービスはシンプルですが、色々な種類のものを提供して、CloudFormationやBeansTalkのような組み合わせを用意してPaaSのように見せる点など、この思想にかなり近いなと思いました。

完璧は死へのカウントダウン

最後に、「さらなる10のUnixの考え方」の章では、90%の解を目指すや、劣っているほうが優れているなど、なるほどねーという感じで読んでました。
特に、"Unixがあらゆる面で本当に良くなったら、今度は死滅の危険を覚悟しなければならない"という箇所。あらゆる面のニーズを受け入れてしまうと複雑になってしまい、Unixの思想と反するところが出てくるから。

完璧なものじゃなく、多少劣っていても、これらの思想を維持できていたからUnixは生き残ってきたのでしょう。

CakePHP1.2から2.3にアップデートしたらサーバの負荷が半減した

あるプロジェクトでCakePHP1.2を使っていたのですが、そろそろサポート期間も終わりそうな気がしたのでCakePHP2.3の最新版にアップデートしました。
サイトは月に数百万PVぐらいの規模で、DBテーブル数は80ぐらい、それに加えてViewテーブルやストアドプロシージャを使ってます。これを3年ぐらい前のさくらの専用サーバ1台でさばいてます。(Xeon 2コア、メモリ4G、Apache, mod_php(5.3), MySQL構成)


CakePHP2からモデルのレイジーローディングなども入ってコア自体も効率化されたため、パフォーマンスは上がるだろうなとは思ってました。
実際に本番サーバにデプロイしたところ、CPUのロードアベレージが半分ほどになりました。


週単位のグラフを見ると、リリース前はピークが200ぐらい、平均100ぐらい(100はtopコマンドなどで見るロードアベレージ1と同じです)。

リリース後には、ピークが100、平均50ぐらいになってます。ちょっと縦軸の幅が違うので分かりにくいかもしれませんが。


1日単位のグラフで見ると、リリース前は日中の負荷は100〜200の間ぐらいでしたが、

リリース後の日中の負荷は100以下になってます


CakePHP1と2のパフォーマンス比較はHelloWorld的なもので1.5倍ぐらいパフォーマンスが良くなるというのは計測で分かってました。実アプリのコードにすると複雑さが上がるのでCakeコアの効率化による恩恵は大きいことが分かりました。


今回の移行では、現行のコードをCakePHP2.3で動かして動かない箇所をひたすら修正していく作業でした。それ以外のリファクタリングは行っていません。
色々と大変だったのですが、移行の話は下記の記事にまとまってます
「Cake Beer TalkでCake1から2への移行Tips100を発表しました」

(2013/4/28) CakePHPのPaginatorコンポーネントに脆弱性、すぐにバージョンアップを!

CakePHP1.2, 1.3, 2.xのPaginatorコンポーネント脆弱性があり、最悪はSQLインジェクションが起こる可能性があるとのこと。
http://bakery.cakephp.org/articles/markstory/2013/04/28/security_release_-_cakephp_1_2_12_1_3_16_2_2_8_and_2_3_4


早急にアップデートすることをおすすめします。
各バージョンの最新版はgitのブランチから取得するか、下記から該当バージョンのzip/tarファイルをダウンロード可能です。
https://github.com/cakephp/cakephp/tags


探すのが面倒な人は、下記から直接ダウンロードを。
https://github.com/cakephp/cakephp/archive/2.3.4.zip
https://github.com/cakephp/cakephp/archive/2.2.8.zip
https://github.com/cakephp/cakephp/archive/1.3.16.zip
https://github.com/cakephp/cakephp/archive/1.2.12.zip

CakePHP2.0、2.1はメンテナンス終了っぽいですね。今後は2.2以上にした方がよいです。


いやはや、ゴールデンウィークにすごいのが出てしまった。。。
10連休にして海外とか行かなくて良かったな orz

CakePHPのレールの外し方(CakePHP勉強会 uluru 2013/04/19)

株式会社うるるで開催された、第1回CakePHP勉強会で発表してきました。
今回のお題は、「エンジニアとデザイナーの協業」でした。


デザイナー向けというのは、実は3回目ぐらいなので何を話そうかなと悩んでました。悩んだ末に、プログラマがどこまでデザイナに優しいCakePHPにカスタマイズできるかやってみようというストーリにしました。



一番言いたかったことは、「ルールは最後に自分たちで決める、決める上で何が正しいかはプロジェクトごとに違うので、世の中で正しいとか、これがCake流だとか、ベストプラクティスとか言ってるのに流されすぎない方が良い」ということでした。
CakePHPでも積極的にヘルパー使わないとか、レイアウトファイル使わないとか、Apache側のmod_rewriteでがんばると世界が広がるとかを、コードベースで紹介しました。特にmod_rewriteを使うという発想でディレクトリ構成を自由にしておくというのは、なんとなくアイディアはあったけど実際やったことがなかったので、今回の発表に合わせて検証して大丈夫だというのが分かり良かったです。


株式会社うるるでのCakePHP勉強会はシリーズもので、第2回、3回と既にお題が決まっております

2013年
4月 #1 エンジニアとデザイナーの協業
6月 #2 プラグイン, PHP Matsuriについて
8月 #3 テスト, CakeFestについて


株式会社うるる社員のイベント運営も素晴らしいですし、ビール飲めますし、開場も熱気があって面白いので、次回も楽しみにしています。


ちなみに株式会社うるるでは、CakePHPで自社サービスを作ってるそうで、絶賛WEBエンジニア募集中のようです。面接の際にはぜひ、cakephperのブログ見たと言ってもらえれば、「へー」って言ってもらえると思います!

git, github講座で3時間ほど話して声が枯れてペットボトルの水3本を消費してきました

4/20にWAVE新宿で下記の講座を開催しました。

「フロントエンド技術をたかめたい・Webクリエイターのためのgithubで始めるgit講座」
〜黒い画面を使わずに、バージョン管理の基本を学ぼう〜


今回は、コワーキングスペース茅場町 Co-Edo(コエド)マルチメディアスクール WAVE株式会社コンテンツワン 、L15の4社主催での開催となりました。


20人ほどの参加者で、3時間ほどやりました。最初の30分でgitとgithubに関して紹介して、残りの時間でハンズオン形式で全員がgithubにpush/pullするまで行いました。
今回は、極力詳細の説明を省略して、とにかく使えるようになるまでを資料にしました。細かい話は質問が出るたびにしていくという感じでした。質問が活発だったので楽しかったです。


GUIクライアントとして登録すれば無料で使えるSourceTreeを使い、githubへの接続はsshを前提にしました。この2つの組み合わせで使えるようになれば、github以外を使う場合にも困ることはないと思って採用しました(github for macや、https接続のみで覚えると、github以外を使うのが難しくなるので)


この内容であれば、また再演できるので、興味がある方はご連絡ください。企業研修でのご要望も受付中です。
今のところ、5月中旬ぐらいに福岡で同じ内容をやる予定です。


資料は下記2点です。



今回は一人で3時間ぐらい大きな声で話し、ワークショップでは受講者のサポートをしたため、すごく疲れましたが、受講者からの質問が活発だったのと懇親会が盛り上がったのですごく楽しかったです。
普段からもっと運動して声を出すようにしたほうが良いですねー