Author Archives: nakajiman

About nakajiman

Deploy or Die

2017年は合計58回の技術イベントと勉強会をランサーズ会場で開催しました

nakajiman|2017年12月24日
イベント/登壇

ランサーズ Advent Calendar 2017 の 24日目を担当してる nakajiman です。

ランサーズのエンジニアチームは、技術イベントや勉強会への参加、登壇、スポンサードの取り組みはもちろんのこと、それらに加えて、ランサーズ会場への技術イベントと勉強会の誘致、まだ、自ら主催しての勉強会の開催も積極的に取り組んできました。

2017年も残すところあと少しということもあり、今年1年、ランサーズ会場で開催した技術イベントと勉強会をまとめてみたところ、なんと合計58回もありました。

1年間の営業日は250日を超えないので、少なくとも1週間に1回は開催してたペースになり、技術に関心をお持ちの多くの方々に、ランサーズに足を運んでいただけた結果となりました。ありがとうございました。

3月

4月

5月

6月

7月

8月

9月

10月

11月

12月

来年もランサーズのエンジニアチームは、技術イベントや勉強会を運営したり、これから運営していこうという技術コミュニティのみなさんを応援していければです。もし、お困りのことがありましたら、お気軽にお声がけください。

また、一緒にエンジニアとして働きながら、技術コミュニティを応援していきたい仲間も募集しています。こちらも、お気軽にお声がけください。

このブログを書き上げたら、近所の小さなケーキ屋さんに、注文してたクリスマスケーキを受け取りにいってきます。メリークリスマス!

CakePHP 3.4 ORM のクエリを調べてみた exists 編

nakajiman|2017年07月14日
CakePHP

愛犬のダックスをサマーカットし過ぎて失敗した 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 は、なかなかの好印象でした。

CakePHP 3 のマイナーバージョンを調べる方法あれこれ

nakajiman|2017年07月12日
CakePHP

田園都市線のあざみ野駅、つくし野駅、つきみ野駅が、ときどき分からなくなる 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分かからないらしいす。乗りたいけど早起きできないのよね。

CakePHP 3.4 Console で Rails Console のように SQL クエリログを表示する方法

nakajiman|2017年07月11日
CakePHP

ステラ・ルーのぬいばが欲しい 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

なんて素敵なことでしょう~ (ミニーマウス風に)

【参加募集】第1回 CakePHP 3.4 ソースコードリーディング 3/22(水) 19:30 渋谷

nakajiman|2017年03月20日
CakePHP

自社サービスの大規模アップデートにあたり、最新版 CakePHP 3.4 の社内勉強会を続けています。

どうせなら、社外の CakePHPer な方々と共に学びあったり、アドバイスを頂きたいと思い、公開勉強会を立てました。

https://lancers-engineer.connpass.com/event/52743/

この勉強会は CakePHP 3.4 ソースコードを読み解き、理解を深めることを目的としています。今回はリクエストのライフサイクルを追っていきます。

もし興味があったり、時間が許すようでしたら、ぜひお立ち寄りください。3/22(水) 19:30 渋谷です。

【React / Digdag / Terraform 勉強会】 – 続々と新規事業を創出する、ランサーズの開発チーム – 発表資料まとめ

nakajiman|2017年03月19日
イベント/登壇

CakePHP 3.4 に夢中のランサーズ @nakajiman です。

2017/03/07(火)、【React / Digdag / Terraform 勉強会】 – 続々と新規事業を創出する、ランサーズの開発チーム – というイベントを開催しました。

以下、その発表資料をまとめて公開します。

WorkFlowEngine Digdagの導入

山中 裕之 / Yamanaka Hiroyuki

1年半React.jsのプロジェクトに関わってみて

沼野 剛志 / Numano Tsuyoshi

Terraformを使ったAWS環境作成の効率化

平塚 貴之 / Hiratsuka Takayuki

ご参加くださった皆様、ありがとうございました。