ランサーズ Advent Calendar 2017 の 24日目を担当してる nakajiman です。
ランサーズのエンジニアチームは、技術イベントや勉強会への参加、登壇、スポンサードの取り組みはもちろんのこと、それらに加えて、ランサーズ会場への技術イベントと勉強会の誘致、まだ、自ら主催しての勉強会の開催も積極的に取り組んできました。
2017年も残すところあと少しということもあり、今年1年、ランサーズ会場で開催した技術イベントと勉強会をまとめてみたところ、なんと合計58回もありました。
1年間の営業日は250日を超えないので、少なくとも1週間に1回は開催してたペースになり、技術に関心をお持ちの多くの方々に、ランサーズに足を運んでいただけた結果となりました。ありがとうございました。
3月
4月
5月
6月
7月
8月
9月
10月
11月
12月
来年もランサーズのエンジニアチームは、技術イベントや勉強会を運営したり、これから運営していこうという技術コミュニティのみなさんを応援していければです。もし、お困りのことがありましたら、お気軽にお声がけください。
また、一緒にエンジニアとして働きながら、技術コミュニティを応援していきたい仲間も募集しています。こちらも、お気軽にお声がけください。
このブログを書き上げたら、近所の小さなケーキ屋さんに、注文してたクリスマスケーキを受け取りにいってきます。メリークリスマス!
愛犬のダックスをサマーカットし過ぎて失敗した nakajiman です。毛並みがチクチクして痛いのです。
CakePHP 3.4 ORM がどんなクエリを発行しているのか調べてみます。まず、簡単なところで、レコードが存在するかどうか調べる exists を見てみます。
Cake Console を使います。CakePHP のバージョン は、次のとおりです。
$ bin/cake console
>>> use Cake\Core\Configure;
>>> Configure::version();
=> "3.4.9"
続けて Cake Console でクエリログを表示する ようにします。
>>> use Cake\Log\Log;
>>> Log::config('queries', ['className' => 'Console', 'stream' => 'php://stderr', 'scopes' => ['queriesLog']]);
>>> $cm = \Cake\Datasource\ConnectionManager::get('default');
>>> $cm->logQueries(true);
Users テーブルにある ID を持つレコードが存在するか exists で確認してみます。
>>> use Cake\ORM\TableRegistry;
>>> $User = TableRegistry::get('Users');
>>> $User->exists(['id' => 1]);
次のようなクエリが発行されました。SELECT 1 は、まったくデータをフェッチしないということですね。また LIMIT 1 で走査する範囲を最小にしてますね。CakePHP 1.3 だと COUNT 句を使っていて、スケールしたら死亡フラグが立ってたんですが、これなら安心ですね。
SELECT 1 AS `existing` FROM users Users WHERE id = 1 LIMIT 1
ソースコードも確認してみます。お、Hydration を無効にして、Entity を生成しないようにしてますね。ソースコードレベルでもコストを抑える工夫がされてます。
/**
* {@inheritDoc}
*/
public function exists($conditions)
{
return (bool)count(
$this->find('all')
->select(['existing' => 1])
->where($conditions)
->limit(1)
->enableHydration(false)
->toArray()
);
}
といった感じで CakePHP 3.4 の exists は、なかなかの好印象でした。
田園都市線のあざみ野駅、つくし野駅、つきみ野駅が、ときどき分からなくなる nakajiman です。
知らない誰かの CakePHP 3 環境を覗くとき、マイナーバージョンってどうやって調べてますか~ってはなしです。
VERSION.txt を見る
$ cat vendor/cakephp/cakephp/VERSION.txt
////////////////////////////////////////////////////////////////////////////////////////////////////
// +--------------------------------------------------------------------------------------------+ //
// CakePHP Version
//
// Holds a static string representing the current version of CakePHP
//
// CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
// Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
//
// Licensed under The MIT License
// Redistributions of files must retain the above copyright notice.
//
// @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
// @link https://cakephp.org
// @since CakePHP(tm) v 0.2.9
// @license https://opensource.org/licenses/mit-license.php MIT License
// +--------------------------------------------------------------------------------------------+ //
////////////////////////////////////////////////////////////////////////////////////////////////////
3.4.9
Configure::version() を使う
ページで表示するなら
<?= Configure::version ?>
CakePHP Console なら
$ bin/cake console
>>> use Cake\Core\Configure;
>>> Configure::version();
=> "3.4.9"
Configure::version って、どう実装されてるのかなぁって見てみると、VERSION.txt を読み込んでいるだけでした。いぇい。
/**
* Used to determine the current version of CakePHP.
*
* Usage
* ```
* Configure::version();
* ```
*
* @return string Current version of CakePHP
*/
public static function version()
{
if (!isset(static::$_values['Cake']['version'])) {
$config = require CORE_PATH . 'config/config.php';
static::write($config);
}
return static::$_values['Cake']['version'];
}
/**
* Core Configurations.
*
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
* @link https://cakephp.org CakePHP(tm) Project
* @since 1.1.11
* @license https://opensource.org/licenses/mit-license.php MIT License
*/
$versionFile = file(CORE_PATH . 'VERSION.txt');
return [
'Cake.version' => trim(array_pop($versionFile))
];
Cake –version を指定する
試しにオプションを指定したら、表示されました。
$ bin/cake --version
3.4.9
その他
これ以外にマイナーバージョンを知る方法をご存じでしたら、ぜひ教えてください。ソースコードのこの部分が○○って書き方してるから、これは 3.3 だねとか、CakePHP 3 愛にあふれた変態級な方法が知りたいです。
追記
もう社内の CakePHP は 3.4.10 で、3.4.9 じゃないですって激しく怒られたので、名誉のための補足です。社内の CakePHP 3 ベースのプロダクトは 3.4.10 です。しかも 3.4.10 は昨日リリースされたばかりのものです。キリッ!
今夏、田園都市線で、時差Bizライナーっていう臨時特急があって、長津田駅から渋谷駅まで 30分かからないらしいす。乗りたいけど早起きできないのよね。
ステラ・ルーのぬいばが欲しい nakajiman です。
Rails Console と同じように CakePHP 3 Console を使いたいんですが、CakePHP Console ってモデルを操作しても、Console にクエリログが表示されないんです。なんでー。ギャー。
そんなときは、Log をカスタマイズして、クエリロゴを標準エラーに出力すれば OK です。次の魔法の 4行を Console に貼り付けます。
>>> use Cake\Log\Log;
>>> Log::config('queries', ['className' => 'Console', 'stream' => 'php://stderr', 'scopes' => ['queriesLog']]);
>>> $cm = \Cake\Datasource\ConnectionManager::get('default');
>>> $cm->logQueries(true);
そうすると、モデルを操作すると、次のように Console にクエリログが表示されるようになります。
>>> use Cake\ORM\TableRegistry;
>>> $User = TableRegistry::get('Users');
>>> $User->exists(['id' => 1]);
2017-07-11 11:43:44 Debug: duration=3 rows=1 SELECT 1 AS `existing` FROM users Users WHERE id = 1 LIMIT 1
なんて素敵なことでしょう~ (ミニーマウス風に)
自社サービスの大規模アップデートにあたり、最新版 CakePHP 3.4 の社内勉強会を続けています。
どうせなら、社外の CakePHPer な方々と共に学びあったり、アドバイスを頂きたいと思い、公開勉強会を立てました。
https://lancers-engineer.connpass.com/event/52743/
この勉強会は CakePHP 3.4 ソースコードを読み解き、理解を深めることを目的としています。今回はリクエストのライフサイクルを追っていきます。
もし興味があったり、時間が許すようでしたら、ぜひお立ち寄りください。3/22(水) 19:30 渋谷です。
CakePHP 3.4 に夢中のランサーズ @nakajiman です。
2017/03/07(火)、【React / Digdag / Terraform 勉強会】 – 続々と新規事業を創出する、ランサーズの開発チーム – というイベントを開催しました。
以下、その発表資料をまとめて公開します。
WorkFlowEngine Digdagの導入
山中 裕之 / Yamanaka Hiroyuki
1年半React.jsのプロジェクトに関わってみて
沼野 剛志 / Numano Tsuyoshi
Terraformを使ったAWS環境作成の効率化
平塚 貴之 / Hiratsuka Takayuki
ご参加くださった皆様、ありがとうございました。