最近の近況〜ISUCONとコミュニテイとPHPカンファレンス仙台の話〜
概要
ブログを開設して、カンファレンスの感想を書くだけなのも味気ないので、近況報告でもしていこうと思います。
ISUCONの話
社内の数人とISUCONに出てみようという話になりました。
早速、こちらの本を参考に勉強を勧めています。
環境はこちらのREADMEを参考に、AWS上で作りましたが、結構つまづき、大変でした。
今はもくもくと本を進めているところですが、それが終わったら、当日に向けて、メンバーとできる限りのレベルアップを行ってきます。
コミュニテイの話
これまた社内のメンバーと、金沢に技術コミュニテイを作ろうという話題が出ました。
自分も含め、金沢に強い人がいない or 見つからないので、コミュニテイを作って、強い人達と交流をしていきたいと思っています。
まだまだ課題がある上、メンバーの技術スタックも違い、苦戦していますが、なんとか形にしていきたいです。
PHPカンファレンス仙台
PHPの現場を聴いて、PHPカンファレンス仙台に行きたいなと思いました。
しかし、金沢から仙台はお金が結構かかります。
迷っていたのですが、会社のバックアップが厚くなり、お金を出してもらえるようになりました。
関西・東京に続き、3つめのPHPカンファレンス。
よろしくおねがいします。
最後に
なんだかんだメンバーに恵まれており、ここ数ヶ月でも貴重な体験ができているなと思います。 関わってくれる人たちに感謝します。
以上、最後まで読んでいただきありがとうございました。
PHPカンファレンス東京2018の感想 #phpcon2018
概要
元々は予定が入っていて行けなかったが、予定がなくなってしまったので、急遽参戦を決めました。
PHPerkaigi2018でカンファレンスに目覚めて、今回で3カンファレンス目になります。 今回も参考になる話が目白押しでした。
聞いてきたセッション
自分が聞いたセッションは下記になります。 朝うだうだしていて、開幕のセッションには間に合いませんでしたが、それ以降はガッツリ参加しました。
- 独立したコアレイヤーパターンによるPHPアプリケーションの実装
- PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
- ユニットテストが入れられないレガシーなソースでCIが回せるようになった
- Phalcon Essentials: Phalcon で作る成長可能なアプリケーション
- 案外よくできているMySQLというアプリケーション
- Webサービスを育てるための組織作りと文化作り
どれも面白いセッションでした。
この中で一番を選ぶとしたら、独立したコアレイヤーパターンによるPHPアプリケーションの実装
になりますね。
元々ブログで公開されたときから、内容は読んでいたのですが、あまり理解できていませんでした。 今回のセッションを聞いたことで、内容を理解出来、よく考えられているパターンだなと感服しました。
「DIP理解した」
またそーだいさんのセッションは、自分が組織やチームに感じている悩みに、ビタッとマッチする内容で、早速プレイヤーとして文化を養うところを始めて行こうと思いました。
その他
懇親会ではセッションとLTのW登壇をしたBASEの東口さんとお話ができたり、PHPerKaigi2019の宣伝を行った長谷川さんとお話ができてよかったです。うさみさんには静的解析ツールの導入について相談もできました。
PHP界隈のカンファレンスは、皆さん暖かくて楽しいですね。
このような場を提供してくれた、スタッフの皆さん・スピーカーの皆さん・参加者の皆さん、ありがとうございました!
刺激を受けにPHPカンファレンス関西2018に参加
概要
PHPerKaigi2018の感想 - juve534のブログでカンファレンスの楽しさを覚え、今回は関西に参戦です。 PHPカンファレンスとしては、今回が初めての参加でしたが、とても楽しめたのでつらつらと感想を書いていきます。
良かったこと
セッションの内容が充実していた
今回は下記のセッションを聞いてきました。
どのセッションも自分のチームで運用できていない話題で、帰ってから取り入れようと思えるものでした。
特に脱「なんちゃって」フロントエンド
の話は、自分たちが手の行き届いていない部分で、すぐに取り入れないと行けないなと思いました。
「ネットワークに接続していません」はエンジニアの怠慢φ(..)
アンカンファレンス
いろんな人が好きに発表できるのは良いなと思いました。
自分はうずら(@uzulla)さんのSwooleの話に参加しましたが、PHPの非同期処理について話が聞け、その後うずらさんに質問もできたので満足です。
(Swooleを軽く触り始めました)
その他
コミュニティの人たちとコミュニケーションが取れる
もくもくブースにコミュニティの人たちがいらっしゃり、そこで話をすることができました。
長谷川さんにはPHPerKaigiの感想を直接伝えることがやっとできました。 本当は当日に伝えないといけませんでしたね。 PHPの現場のMasashi Shinbara(@shin1x1)さんには、ポッドキャストの感想と開発の悩みを相談することができました。
自分は入社してからずっと同じ会社でエンジニアをやっており、外部のエンジニアと話せるのは、めったにない体験でした。 しかも、普段地方にてなかなか会えないコミュニティの人たちでしたので貴重な体験でした。
名札・ガチャガチャ
名札にシールを貼ることができ、それで参加者の属性がわかるのは面白いなと思いました。 自分ですと、下記のように遠征組でレガシーと戦っているという表現ができますね。 これは懇親会で話を作りやすい試みだなと思いました。
ガラポンは絵柄もかわいいし、アメニティも良いものがあったらしいのですが、引き忘れてしまいました…。(カードも持って帰ってしまった)
カードは企業ブースやセッションで貰うことができたので、スポンサーや登壇者にも旨味がある作りになって、良い仕掛けだなと思いました。
最後に
PHPカンファレンスは初めての参加でしたが、とても充実した1日でした。 運営の皆様、ありがとうございました!
CakePHPのモデルでメモリを消費した話
概要
CakePHP1系のアプリケーションでメモリリミットが起きていました。 原因を調査したところ、Primarykeyに検索をかけるだけの単純なクエリ実行で、メモリを多めに消費していることがわかりました。
原因
CakePHP1系のキャッシングが原因でした。
queryメソッドを使ってSQLを実行する場合、第2引数にfalse
を渡さないとキャッシングしてしまいます。その結果、想定より多めにメモリを消費していました。
その後
原因がわかったので、第2引数にfalse
を渡すことで解決できそうです。
ちなみに先輩からはバグだと言われましたが、2系でも同様の処理があるので、これはCakePHPの仕様なんだろうなと思います。
参考
https://book.cakephp.org/1.3/ja/The-Manual/Developing-with-CakePHP/Models.html#query
https://book.cakephp.org/2.0/ja/models/retrieving-your-data.html#model-query
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
を使っていることが、差分として発生していました。
そのため、__construct
をsetUp
に置き換えて見ると、正常にテストは動きました。
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