最近の近況〜ISUCONとコミュニテイとPHPカンファレンス仙台の話〜

概要

ブログを開設して、カンファレンスの感想を書くだけなのも味気ないので、近況報告でもしていこうと思います。

ISUCONの話

社内の数人とISUCONに出てみようという話になりました。
早速、こちらの本を参考に勉強を勧めています。
環境はこちらのREADMEを参考に、AWS上で作りましたが、結構つまづき、大変でした。

今はもくもくと本を進めているところですが、それが終わったら、当日に向けて、メンバーとできる限りのレベルアップを行ってきます。

コミュニテイの話

これまた社内のメンバーと、金沢に技術コミュニテイを作ろうという話題が出ました。
自分も含め、金沢に強い人がいない or 見つからないので、コミュニテイを作って、強い人達と交流をしていきたいと思っています。

まだまだ課題がある上、メンバーの技術スタックも違い、苦戦していますが、なんとか形にしていきたいです。

PHPカンファレンス仙台

PHPの現場を聴いて、PHPカンファレンス仙台に行きたいなと思いました。
しかし、金沢から仙台はお金が結構かかります。
迷っていたのですが、会社のバックアップが厚くなり、お金を出してもらえるようになりました。

関西・東京に続き、3つめのPHPカンファレンス
よろしくおねがいします。

最後に

なんだかんだメンバーに恵まれており、ここ数ヶ月でも貴重な体験ができているなと思います。 関わってくれる人たちに感謝します。

以上、最後まで読んでいただきありがとうございました。

PHPカンファレンス東京2018の感想 #phpcon2018

概要

元々は予定が入っていて行けなかったが、予定がなくなってしまったので、急遽参戦を決めました。

PHPerkaigi2018でカンファレンスに目覚めて、今回で3カンファレンス目になります。 今回も参考になる話が目白押しでした。

聞いてきたセッション

自分が聞いたセッションは下記になります。 朝うだうだしていて、開幕のセッションには間に合いませんでしたが、それ以降はガッツリ参加しました。

どれも面白いセッションでした。
この中で一番を選ぶとしたら、独立したコアレイヤーパターンによるPHPアプリケーションの実装になりますね。

元々ブログで公開されたときから、内容は読んでいたのですが、あまり理解できていませんでした。 今回のセッションを聞いたことで、内容を理解出来、よく考えられているパターンだなと感服しました。

DIP理解した」

またそーだいさんのセッションは、自分が組織やチームに感じている悩みに、ビタッとマッチする内容で、早速プレイヤーとして文化を養うところを始めて行こうと思いました。

その他

懇親会ではセッションとLTのW登壇をしたBASEの東口さんとお話ができたり、PHPerKaigi2019の宣伝を行った長谷川さんとお話ができてよかったです。うさみさんには静的解析ツールの導入について相談もできました。

PHP界隈のカンファレンスは、皆さん暖かくて楽しいですね。

このような場を提供してくれた、スタッフの皆さん・スピーカーの皆さん・参加者の皆さん、ありがとうございました!

刺激を受けにPHPカンファレンス関西2018に参加

概要

PHPerKaigi2018の感想 - juve534のブログでカンファレンスの楽しさを覚え、今回は関西に参戦です。 PHPカンファレンスとしては、今回が初めての参加でしたが、とても楽しめたのでつらつらと感想を書いていきます。

良かったこと

セッションの内容が充実していた

今回は下記のセッションを聞いてきました。

  • 脱「なんちゃって」フロントエンド
  • PHPer向けWebアプリケーションのパフォーマンスチューニング入門
  • PHPアプリケーションのコンテナ化入門
  • HerokuでPHPアプリ開発速度を倍にする

どのセッションも自分のチームで運用できていない話題で、帰ってから取り入れようと思えるものでした。
特に脱「なんちゃって」フロントエンドの話は、自分たちが手の行き届いていない部分で、すぐに取り入れないと行けないなと思いました。
「ネットワークに接続していません」はエンジニアの怠慢φ(..)

アンカンファレンス

いろんな人が好きに発表できるのは良いなと思いました。
自分はうずら(@uzulla)さんのSwooleの話に参加しましたが、PHPの非同期処理について話が聞け、その後うずらさんに質問もできたので満足です。 (Swooleを軽く触り始めました)

その他

コミュニティの人たちとコミュニケーションが取れる

もくもくブースにコミュニティの人たちがいらっしゃり、そこで話をすることができました。

長谷川さんにはPHPerKaigiの感想を直接伝えることがやっとできました。 本当は当日に伝えないといけませんでしたね。 PHPの現場Masashi Shinbara(@shin1x1)さんには、ポッドキャストの感想と開発の悩みを相談することができました。

自分は入社してからずっと同じ会社でエンジニアをやっており、外部のエンジニアと話せるのは、めったにない体験でした。 しかも、普段地方にてなかなか会えないコミュニティの人たちでしたので貴重な体験でした。

名札・ガチャガチャ

名札にシールを貼ることができ、それで参加者の属性がわかるのは面白いなと思いました。 自分ですと、下記のように遠征組でレガシーと戦っているという表現ができますね。 f:id:juve534:20180717203944j:plain これは懇親会で話を作りやすい試みだなと思いました。

ガラポンは絵柄もかわいいし、アメニティも良いものがあったらしいのですが、引き忘れてしまいました…。(カードも持って帰ってしまった)
カードは企業ブースやセッションで貰うことができたので、スポンサーや登壇者にも旨味がある作りになって、良い仕掛けだなと思いました。

最後に

PHPカンファレンスは初めての参加でしたが、とても充実した1日でした。 運営の皆様、ありがとうございました!

CakePHPのモデルでメモリを消費した話

概要

CakePHP1系のアプリケーションでメモリリミットが起きていました。 原因を調査したところ、Primarykeyに検索をかけるだけの単純なクエリ実行で、メモリを多めに消費していることがわかりました。

原因

CakePHP1系のキャッシングが原因でした。 queryメソッドを使ってSQLを実行する場合、第2引数にfalseを渡さないとキャッシングしてしまいます。その結果、想定より多めにメモリを消費していました。

その後

原因がわかったので、第2引数にfalseを渡すことで解決できそうです。 ちなみに先輩からはバグだと言われましたが、2系でも同様の処理があるので、これはCakePHPの仕様なんだろうなと思います。

参考

モデル - 1.3

データを取得する - 2.x

2回目にvagrantを立ち上げたらディスクエラーが発生した件

概要

swooleを触ってみようとytakeさんのvagrant boxを立ち上げた。
一回目は特に問題なく立ち上がったのだが、再度立ち上げたところディスク共有のところでエラーが…。

Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=1000,gid=1000 vagrant /vagrant

The error output from the command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device

一先ず下記の手順で作業をすることで復旧はできたので、ゲストとホストのkernelのバージョンが違ったんだとは思うが、2回目でエラーが出たのは初めてだ。

1. Host側でvagrant plugin install vagrant-vbguest
2. Host側でvagrant vbguest
3.仮想側でsudo yum -y update kernel
4.仮想側でsudo yum -y install kernel-devel kernel-headers dkms gcc gcc-c++
5.Host側でvagrant reload

PHPUnitでdataProviderが動作せずに時間を食った話

概要

PHPUnitを使って、PHPのテストコードを書いていたところ、dataProviderが動かなくて、数時間悩みました。
備忘録として、情報を残しておきます。

なにがあった?

下記のようなテストコードを書いて、PHPUnitを実行したところ、 rgumentCountError: Too few arguments to function ExampleTest::checkExceptionTest()
というように引数があってないよーというエラーが発生しました。

dataProvider のDoccommentはTypoもなく、メソッド名も適切な名前になっていました。

class ExampleTest extends TestCase
{
    /**
     * @var Example
     */
    public $_obi;

    public function __construct()
    {
        parent::__construct();
        $this->_obj = new Example();
    }

    public function checkExceptionDataProvider():array
    {
        return [
            'number 1' => [1, \LogicException::class, 'number 1'],
            'number 2' => [2, \ErrorException::class, 'number 2'],
        ];
    }

    /**
     * @test
     * @dataProvider checkExceptionDataProvider
     */
    public function checkExceptionTest($param, $errorClass, $errorMessage)
    {
        $this->expectException($errorClass);
        $this->expectExceptionMessage($errorMessage);

        $this->_obj->checkExecption($param);
    }
}

なにが原因だった?

既存でdataProviderを使っている箇所と見比べると、テストケースの初期化として__constructを使っていることが、差分として発生していました。
そのため、__constructsetUpに置き換えて見ると、正常にテストは動きました。

PHPUnit マニュアル – 第4章 フィクスチャを見ると、テストデータを生成する際はsetUpを使えと書いてあるので、そもそも__constructを使うのが亜流ということですね…。

PHPUnitのコードを読めば、エラーの原因が詳細にわかりそうなのですが、余力がないの今日はここまで。

CakePHP2系でComponentの単体テストを行って躓いた話

概要

CakePHP2系のアプリケーションに、新規でComponentを作成した。 そのComponentに対して、単体テストを行うとしたところ躓いたので残しておく。

内容

Componentに対して単体テストを作成し、公式ドキュメントを参考にsetUpに下記を記述。

public function setUp()
{
    parent::setUp();
    $CakeRequest      = new CakeRequest();
    $CakeResponse     = new CakeResponse();
    $this->Controller = new テスト用Controller($CakeRequest, $CakeResponse);
    $Collection       = new ComponentCollection();
    $this->Component = new テスト対象のComponent($Collection);
    $this->Component->startup($this->Controller);
}

これでテストケースを書いて実行したところ、テストケースが正常に走らなかった。 エラーログを確認したところ、下記が出力されている。

Error: Fatal Error (1): Call to a member function メソッド名() on a non-object

この出力されたメソッドはテスト用Controllerの親クラス(AppController)に定義されており、Webページとしてアクセスする分には問題なく利用できている。

何が原因なんだ…。

解決

テストケースのsetUp内に $Collection->setController($this->Controller); を追加することで解決した。

エラーログを見ると、メソッドがないと怒られているので テスト対象のComponent 内でControllerから受け取った値を見てみた(下記コードのgetController結果)。 すると、値がnullとなっており、Controllerがセットされていないことがわかった。

public function __construct(ComponentCollection $collection, $settings = array())
{
    $this->Controller = $collection->getController();
    parent::__construct($collection, $settings);
}

getがあるなら、setがあるだろうとCakePHPのコードを確認したところ、setControllerがあったのでビンゴ。 setControllerを呼び出すことで解決した。

public function setUp()
{
    parent::setUp();
    $CakeRequest      = new CakeRequest();
    $CakeResponse     = new CakeResponse();
    $this->Controller = new テスト用Controller($CakeRequest, $CakeResponse);
    $Collection       = new ComponentCollection();
    $Collection->setController($this->Controller);
    $this->Component = new テスト対象のComponent($Collection);
    $this->Component->startup($this->Controller);
}

以上、誰かのためになったら良いなと思い残しておきます。 最後まで読んで頂きありがとうございました。

参考

https://book.cakephp.org/2.0/ja/development/testing.html#id27