Amazon Campaign

2014年8月18日月曜日

【紹介】はじめてのフレームワークとしての FuelPHP 第2版 実践編

この度「はじめてのフレームワークとしての FuelPHP 第2版 実践編」(鈴木憲治 著)をご提供いただいたので紹介したいと思います。 (憲治さん、遅くなってしまいスミマセン。。。)

はじめてのフレームワークとしてのFuelPHP第2版(3) 実践編
鈴木憲治
達人出版会
発行日: 2014-04-23
対応フォーマット: EPUB, PDF

 FuelPHP のオンラインマニュアルはAPIリファレンス的な構成となっているため、用意されている様々な機能を応用しにくく感じていました。
この書籍は「実践編」と銘打っているだけあって、実際のアプリケーション構築の際に必要とされるであろう事項に対して、Fuelを使っていかに実装するかが書かれており非常に実践的です。実際の開発現場できっと役立つと思います。

 そんな中で特に有用だと感じたのは、アプリケーションレイヤー毎のテスト方法について詳しく書かれている点です。例えば「4.7 モデルのテスト」では、データベース上への効率的なテストデータ作成方法や、「第6章 コントローラのユニットテスト」では通常はテストし難いコントローラのテストを AspectMock を用いて行う方法が書かれています。今回はそれぞれ簡単に紹介してみようと思います。

モデルのユニットテスト

モデルをテストするためには事前にデータベース上にテストデータを格納しておく必要があります。ボクは今まで Fuel の Orm\Model クラスを利用してテストデータを作成していました。

 例)Orm\Model を使ったテストデータの作成例
$u = Model_User::forge(array(
    'username' => '担当1',
    'password' => 'KWd27qfZtlw9qbEVMe5v2zRnZUuC0Eqa330cdN+9lro=',
    'email' => 'hoge@hoge.jp',
    'last_login' => '2013-08-30 00:00:00',
    'created_user' => 1,
));
$u->save();

$g = Model_Group::forge(array(
        'name' => 'グループ1',
        'status' => 0,
        'created_user' => 1,
));
$g->save();

書籍では YAML ファイルでテストデータを記述して、Fuel の Format クラスを使ってデータ登録する方法が紹介されています。この方が保守性も汎用性も高くよいですね。さっそく現場で活用できそうです。

 例)YAML ファイルを使ったテストデータの作成(書籍からの引用)
id: 1
name: 小野小町
email: komachi@example.jp
comment: |
    花の色は移りにけりないたづらに
    我が身世にふるながめせし間に
ip_address: 192.168.1.1
user_agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:11.0) Gecko/20100101 Firefox/11.0
created_at: 1333524234
updated_at: 1333524234
-
id: 2
name: 文屋康秀
email: yasuhide@example.jp
comment: |
    吹くからに秋の草木のしをるれば
    むべ山風を嵐といふらむ
ip_address: 10.10.10.10
user_agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
created_at: 1333534305
updated_at: 1333534305

上記 YAML を下記コードで配列にして DB へインサート出来ちゃいます。

$data = file_get_contents($fixt_file);
$data = Format::forge($data, static::$file_type)->to_array();

foreach ($data as $row) {
    DB::insert($table)->set($row)->execute();
}

また、ボクは Format クラスの存在を知らなかったのですが便利なクラスですね。YAML 以外にも様々なファイルフォーマットに変換可能で下記フォーマットに対応していて今後活躍してくれそうです。

  • CVS
  • XML
  • json
  • シリアライズ文字列
  • xml:ns


コントローラのユニットテスト

コントローラのユニットテストとして「AspectMock」というモックアップツールを使った方法が紹介されています。 コントローラのユニットテストは難しいのでボクはユニットテストは諦めて、テストサーバを立てて PHPUnit_Extensions_Selenium2TestCase によるUIテストによる自動化を行ってきましたが、AspectMock を使えば簡単にユニットテストができます。
例えば static メソッドである Validation::run() で true を返させたい場合はコントローラを呼ぶ前に下記コードを呼んでおくだけです。

use AspectMock\Test as test;

・・・略・・・

test::double('Fuel\Core\Validation', ['run' => true]);

// HMVCリクエストを実行
$response = Request::forge('form/confirm')->execute()->response();

便利ですねぇ。もう明日からでも使いたい気分です。 他にも

  • 2.1.5 独自検証ルールの作成
  • 2.3 ファンクショナルテストの追加
  • 第7章 コードカバレッジ解析

など、現場で即活用したい内容が目白押しです。すでにFuelを利用している方にはとても役立つ書籍だと思うのでオススメです。


はじめてのフレームワークとしてのFuelPHP第2版(3) 実践編
鈴木憲治
達人出版会
発行日: 2014-04-23
対応フォーマット: EPUB, PDF

2014年5月6日火曜日

phpQuery 注意点

phpQueryを使ってみたので注意点を共有します。

利用バージョン


  • phpQuery 0.9.5
  • PHP 5.4

Webサイトからの取得方法

Webサイトからドキュメントを取得する場合のコードは下記のようになります。
$html = file_get_contents('http://www.yahoo.co.jp/');
\phpQuery::newDocument($html);

tbodyがパースされない

phpQueryは読み込んだDOMに対してCSSセレクタを用いて要素を抽出します。ボクが読み込んだページに対では<tbody>タグが読み込まれずに無視されました。例えば
#system-contents > table.hoge > tbody > tr.abc
というセレクタの場合
#system-contents > table.hoge > tr.abc
と指定する必要があります。他にも同様のタグがあるかもしれませんが、今のところ<tbody>以外には遭遇していません。

children() で指定するセレクタは子供または子孫セレクタから記述する

1度セレクタで取得したオブジェクトに対して再度セレクタで要素を絞りたい場合があると思います。セレクタで取得したオブジェクトは phpQueryObject であるため、children('セレクタ文字列') メソッドで行います。 ここで指定するセレクタは抽出済みの要素に対する子供または子孫となるため、子供の場合は'>'、子孫の場合はスペースから始める必要があります。

例)

$hoge->children('> td')->eq(0)->text());
$hoge->children(' td')->eq(0)->text());

2014年1月17日金曜日

三崎 うらり の「にじいろさかな号」に乗るならランチセットがお得!

神奈川県 三浦市 三崎の水産産直センター「うらり」に遊びに行く際は、水中観光船「にじいろさかな号」への乗船がオススメです。三崎の風景はもちろん、魚の観察、餌付け、カモメへの餌付けも楽しめます。


こちらのビデオがとても楽しさが伝わります。

そんな「にじいろさかな号」にお得なランチセットプランがあります。ランチのグレードによって3つのプランがあり、最も安いプランは1500円から。
ランチは提携している港周辺の食事処での食事となるのでお店選びの楽しさも味わえます。

ランチセットメニュー
ランチセットメニュー

今回選んだお店は乗船所の湾の向かいあるログハウスのお店「はまゆう」です。
こちらのお店は地元の漁師さんの奥さんたちが切盛りしていて、家庭的で暖かいメニューが特徴です。
選んだメニューは1500円コースの「はまゆう定食」(写真左上)。いかコロッケと"さんが"のメニューです。
このメニューを普通に購入すると

乗船料 1200円(大人) + はまゆう定食 900円 = 2100円

のところ、ランチセットだと 1500円です。

※ランチセットに子供料金のセットはありませんのでご注意ください。子供の乗船料は 600円です。

料金、運行スケジュール
料金、運行スケジュール

2013年12月4日水曜日

FuelPHP カスタムSQLの実行時のエスケープ

FuelPHP の DB への問い合せは SQL を抽象化した「Query Builder」を使いますが、where句が複雑な場合や副問い合せを行う場合などはメソッド呼び出しが多くなりコードの見通しが悪くなってしまうので、直接 SQL を記述したくなります。

例)Query Builder を使う場合


// 下記SQLを Query Builder を使って記述すると
// SELECT * FROM `users` WHERE `name` != "John" AND `surname` = "Doe"
// AND (`email` = "jim@jim.com" OR `email` = "haha@joke.com")

// 下記のようになります。

$query = DB::select('*')->from('users');

// 最初の where ステートメントをセット
$query->where('name', '!=', 'John');

// あたらしい条件を追加
$query->and_where('surname', 'Doe');

// ネストした where をコールバックで
$query->where(function($query){
    $query->where('email', 'jim@jim.com')
        ->or_where('email', 'haha@joke.com');
});

例)SQL を直接記述する場合

SQL を直接記述する際は DB::query() を使いますが、この場合 Query Builder で行われていた値のエスケープは行われませんので、DB::quote() を使って個別に行います。quate() はエスケープの他にもメソッド名の通りクウォーテーションもしてくれます。

$name = DB::quate($name);
$surname = DB::quate($surname);
$email1 = DB::quate($email1);
$email2 = DB::quate($email2);

$query = "SELECT * FROM users WHERE name != $name AND surname = $surname AND (email = $email1 OR email = $email2)";
$users = DB::query($query, DB::SELECT)->as_object('Model_User')->execute();

FuelPHP UA判定に mbstring 拡張モジュールは不要

UserAgent は Agent クラスで判定する

PHP で UserAgent を判定する場合、mbstring 拡張モジュールをインストールし mb_ereg() 関数などを使って判定しますが、FuelPHP を使っている場合は Agent クラスを使って判定することができます。

例)IE9 未満の判定

// IE9 未満の場合は専用の CSS を出力する
if(Agent::browser() == 'IE' and Agent::version() < 9) {
    echo Asset::css('ie.css');
}

2013年11月18日月曜日

オランダ戦 奇麗すぎる2点目は忘れるべき

ゲンクでのオランダ戦は久しぶりに楽しめた試合でした。特に2点目は素晴らしかった。素晴らし過ぎた。 20年近く代表の試合を見ていて、あそこまでゴール前で細かく数多くパスが繋がり、なおかつゴールできたのは初めてと言っていいぐらい。 そう、20年に1度あるかないかという奇麗さでした。 だから、「イメージ通り」と言っている選手たちの発言がちょっと気掛かりです。あれはとてもじゃないけれど狙って何度もできる代物ではありません。 またあれを狙ってやろうとすると、ゴール前でパス偏重となりシュート意識の低下を招き、必要以上なパス交換でカットされる確率を高めるだけです。 もっとシンプルにゴールは狙えるはず。このゴールは忘れてくれることを願います。

2013年11月2日土曜日

OSX Mavericks の AirPlayマルチディスプレイは MacBook Air 2010では使えず

Mavericks の「AirPlayマルチディスプレイ」という機能、ご存知ですか?
AppleTV があれば Mac から AirPlay 経由でハイビジョンテレビをマルチディスプレイとして利用できるんです。MacBookAir は特に画面が狭いので期待していたのですが、残念ながら MacBookAir の場合は 2011 モデル以降ということで、うちの 2010 ではダメでした。。。
利用条件が合う方は試してみてください。

利用条件

  • MacBook Air(Mid 2011以降)
  • Apple TV(第2世代以降)

Mavericks 各機能の利用条件


http://www.apple.com/jp/osx/specs/

Amazon_ad